1

以下失败,因为我要分配的对象被复制然后被破坏。那么我应该将其声明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 中自动释放的全部意义)。

4

1 回答 1

3

我要做的是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

于 2013-05-13T16:23:38.990 回答