下面的操作失败,因为我想要赋值的对象正在复制,然后销毁。所以我应该声明B::data
作为一个指针,或者有一些更好的花哨的方式来分配引用而不是复制(我想避免触发医生)?
class B {
class myContainer{
myContainer() {/* allocate memory */}
~myContainer() {/* free memory */}
...
};
myContainer data;
};
...
void foo() {
B x;
x.data = myContainer(...); // creates a myContainer, *copies* to x.data, then destroys
}
理想情况下,我不想使用new
,因为我想在堆栈上分配myContainer(因此不必手动管理内存,这是在dr中自动释放的全部意义)。
我要做的是将data
作为myContainer
的参考。所以:
class B
{
public:
class myContainer
{
...
};
myContainer& data;
B(myContainer& d) : data(d) {}
};
void foo()
{
B::myContainer a;
B x(a);
}
注意:在这种情况下,你需要myContainer
的持续时间至少和B
的一样长,所以如果你能预见到有人会这样做,那么在这种情况下不做事情是有很好的理由的:
B* bar()
{
B::myContainer a;
B *p = new B(a);
return p;
}
现在,当bar
结束时,a
正在被破坏。但是在*p
中仍然有对它的引用,所以当我们试图以某种方式使用p->data
时,事情会变得非常奇怪。