【发布时间】:2013-02-16 15:55:25
【问题描述】:
我正在尝试使用std::async 并最终得到一个看起来像这样的代码:
class obj {
public:
int val;
obj(int a) : val(a) {
cout << "new obj" << endl;
}
~obj() {
cout << "delete obj" << endl;
}
};
void foo(obj a) {
this_thread::sleep_for(chrono::milliseconds(500));
cout << a.val << endl;
}
int main(int argc, int **args) {
obj a(5);
auto future = async(foo, a);
future.wait();
return 0;
}
结果是:
new obj
delete obj
delete obj
delete obj
5
delete obj
delete obj
delete obj
然后我尝试将void foo(obj a) 更改为void foo(obj &a):
new obj
delete obj
delete obj
delete obj
5
delete obj
delete obj
为什么要为这个简单的代码制作我的对象的 5 个副本? 我不得不承认,我真的很困惑。有人愿意解释一下吗?
编辑
我正在使用 VS2012
【问题讨论】:
-
尝试在
obj类中复制或移动构造函数。 -
虽然他看到了复制构造函数的效果,但知道为什么还有 5 个额外的副本仍然会很有趣。我按照代码的简单思维可以看到三个(可能是 4 个)明显的,但至少有两个不是立即显而易见的。
-
在 GCC 4.7 上使用
const obj&作为foo的参数,我得到 3 个“删除 obj”,这意味着正在制作 2 个副本。 -
@JoachimPileborg 复制构造函数被调用的次数与删除次数一样多。但我更想知道为什么多次调用复制构造函数,以及如何防止这种情况(如果它是一个更大的对象,那就太浪费了)
-
您是否使用启用优化进行编译?