我有一个类似于此的课程:
但是,在初始构造函数之后,复制构造函数被调用了10次。 如果我不做线程创建步骤。它被称为4次,这是我所期待的。 为什么会这样,我该如何避免呢?
在这种情况下我应该避免使用std :: vector而只是做新删除吗?
#include <cstdio>
#include <vector>
class A
{
public:
A() { printf("hello\n"); }
~A() { printf("Goodbye\n"); }
A(const A&)
{
printf("copy constructing\n");
}
Thread() { }
};
int main()
{
std::vector<A> a(4, A);
for (int i = 0; i < a.size(); i++){
threads_.create_thread(boost::bind(&A::Thread, a[i]));
}
}
好的,我发现了问题。
此:
threads_.create_thread(boost::bind(&A::Thread, a[i]));
应该是:
threads_.create_thread(boost::bind(&A::Thread, &a[i]));
答案 0 :(得分:3)
for (int i = 0; i < a.size(); i++){
threads_.create_thread(boost::bind(&A::Thread, boost::ref(a[i]) ));
}
来自Boost.Bind:
绑定的参数是 由内部复制和持有 返回的函数对象。例如, 在以下代码中:
int i = 5;
bind(f,i,_ 1);
存储i的值的副本 进入函数对象。提高:: REF 和boost :: cref可以用来制作 函数对象存储引用 到一个对象,而不是一个副本:
int i = 5;
bind(f,ref(i),_ 1);
bind(f,cref(42),_ 1);
答案 1 :(得分:1)
线程在这里无关紧要。 “问题”是boost::bind
;它会复制你给它的参数,因此它可以在以后调用时使用该值。 Use ref
所以它存储了一个引用。
在这种情况下我应该避免使用std :: vector而只是做新删除吗?
咦?为什么要这么做?你需要克服制作副本的事实;刚刚发生。您应该首先担心编写干净,可维护的代码,而不是您是否碰巧复制。没有理由在new[]
上使用std::vector
; 从不使用delete
。