通过引用分配对象,无需复制

时间:2013-05-13 16:20:13

标签: c++ variable-assignment

以下操作失败,因为我要分配的对象正在复制已销毁。那么我应该将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中自动释放的全部要点)。

1 个答案:

答案 0 :(得分:2)

我要做的是让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时,事情会变得非常奇怪。