以下操作失败,因为我要分配的对象正在被复制,然后被销毁。那么我应该将 B::data
声明为指针,还是有更好的方式通过引用分配而不是复制(我想避免触发 dtor)?
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(因此不必手动管理内存,这是在 dtor 中自动释放的全部意义所在) .
最佳答案
我要做的是让 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
时,事情会变得很奇怪。
关于c++ - 通过引用分配对象,无需复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16526729/