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

标签 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 中自动释放的全部意义所在) .

最佳答案

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

相关文章:

c++ - 如何让 fmt::format 与 wchar_t 一起工作?

c++ - 类型删除和 lambdas : (Partial) template speciallization matching lambda expressions

C++声明自定义类对象使用=赋值初始化的过程是怎样的?

ruby - 解析与操作的可变范围和顺序 : Assignment in an "if"

c++ - 在指向类类型对象的指针上使用 delete-expression 的合法性,其生命周期已结束的平凡析构函数/标量类型

c++ - 在 C++ 中使用 XOR 0xffffffff 或 ~ 翻转位?

Python多重赋值问题(列表)

python并行赋值3个变量

C++ : Running time of next() and prev() in a multiset iterator?

c++ - 从文件中读取行并存储在单独的字符串变量中