为什么这么多次调用复制构造函数?

时间:2010-11-09 11:59:24

标签: c++ boost

我有一个类似于此的课程:

但是,在初始构造函数之后,复制构造函数被调用了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]));

2 个答案:

答案 0 :(得分:3)

查看Boost.Ref

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