处理包含动态分配成员的对象向量

Posted

技术标签:

【中文标题】处理包含动态分配成员的对象向量【英文标题】:Handling vectors of objects containing dynamically allocated members 【发布时间】:2014-03-16 18:46:29 【问题描述】:

假设我有一个包含动态分配成员的类,如下所示:

class example

  private:
          otherClass * pointer;
  public:
          example(int foo) pointer = new otherClass(foo); 
          ~example()delete pointer;
;
//defining template parameter
example template(1);

现在假设我想将该模板对象动态 push_back 到一个向量中,如下所示:

std::vector<example> myVector;
for(int i=0; i<5; i++)
   myVector.push_back(template);
myVector.erase(myVector.begin());

我的问题是:如何准备类来处理动态分配的指针?我知道我需要重载复制构造函数,但我还需要重载复制赋值吗?那么移动构造器或移动分配呢?还有其他我忘记的预防措施吗?

【问题讨论】:

我建议您为该类选择另一个名称,因为它可能与 C++ 模板混淆。 根据您的用例查看 shared_ptr 或 unique_ptr。 阅读the rule of three。 你必须让你的班级关注the rule of three,或者设计成不需要直接进行资源管理的方式。 template 是关键字,因此实际上尝试将其用作标识符是非法的。 【参考方案1】:

如何准备类来处理动态分配的指针?我知道我需要重载复制构造函数,但我还需要重载复制赋值吗?移动构造器或移动赋值呢?

如何实现动态分配的成员的复制有三种选择:

    通过将复制构造函数和赋值运算符设为非私有或deleted 来禁用复制。 使用具有共享所有权语义的指针(例如std::shared_ptr)对指针成员进行浅拷贝。使用编译器生成的复制构造函数和赋值。 深拷贝。通过按值存储成员并使用编译器生成的复制构造函数和赋值,或者对于指针成员,在用户定义的复制构造函数和赋值运算符中分配新副本以及移动重载。

【讨论】:

【参考方案2】:

我不确定我是否完全理解了您的问题,所以我将首先讲述我未解决的问题。

for 循环后的向量包含 5 个对象。这些对象中的每一个都指向 otherClass 的同一个对象。 一旦你删除了一个对象,析构函数将被自动调用,而 otherClass 的对象将被删除。

问题是vector中剩下的4个对象现在指向了一些已经被删除的内存。

我认为解决问题的方法是更改​​类的定义并使用引用计数智能指针。

class example

  private:
      std::shared_ptr<otherClass> pointer;
  public:
      example(int foo) : pointer(new otherClass(foo)) 
      ~example()
;

这样,只有从你的vector中删除第5个对象才会删除otherClass的对象。

【讨论】:

以上是关于处理包含动态分配成员的对象向量的主要内容,如果未能解决你的问题,请参考以下文章

在删除指向动态分配对象的指针向量中的元素之前,我需要做啥?

类和动态内存分配

彻底销毁动态分配对象的向量

堆中连续分配对象的动态向量

C ++将抽象类型的动态分配对象传递给函数并存储在向量中[重复]

如何复制动态分配的对象(具有一个类的 const 成员)