У меня есть довольно простой тестовый код. У меня есть класс, который просто регистрирует все операции над ним. Я привязал его к объекту boost::function
следующим образом:
void Function(const Foo&)
{
printf("Function invoked\n");
}
// ...
boost::function<void(void)> func;
{
Foo f;
printf("\nConstructing function\n");
func = boost::bind(&Function, f);
printf("Construction complete\n\n");
}
Я ожидаю, что объект функции содержит копию f
. Поэтому создание хотя бы одной копии является обязательным. Тем не менее, я нахожу, что я получаю временные файлы 13. Выход:
Constructing function
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Construction complete
Я не могу использовать ref
или cref
, потому что мне это нужно, чтобы сделать копию объекта. Я делаю что-то ужасно неправильно? Или мне нужно использовать обертку (например, boost::shared_ptr
), чтобы избежать абсурдного количества копий?
Полный код и демонстрацию проблемы можно найти на Codepad.