かなり基本的なテストコードがあります。すべての操作をログに記録するだけのクラスがあります。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。したがって、少なくとも1つのコピーを作成する必要があります。しかし、私は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にあります。