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

Handling vectors of objects containing dynamically allocated members

本文关键字:对象 向量 成员 包含 动态分配 处理      更新时间:2023-10-16

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

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

现在假设我想动态地将模板对象push_back放入vector对象,如下所示:

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

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

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

有三种方法可以实现动态分配成员的复制:
  1. 通过将复制构造函数和赋值操作符设置为非私有或delete d来禁用复制。
  2. 通过使用具有共享所有权语义的指针对指针成员进行浅拷贝,例如std::shared_ptr。使用编译器生成的复制构造函数和赋值。
  3. 深拷贝。通过按值存储成员并使用编译器生成的复制构造函数和赋值,或者,对于指针成员,在用户定义的复制构造函数和赋值操作符中分配新的副本以及move重载。

我不确定我是否很好地理解了你的问题,所以我将首先讲述我所理解的内容。

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

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

在我看来,你的问题的解决方案是改变你的类的定义和使用引用计数智能指针。

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

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