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

时间:2014-03-16 18:46:30

标签: c++ oop pointers vector

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

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

现在让我们假设我想将该模板对象动态推送回向量,如下所示:

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

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

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解你的问题,所以我首先要讲述我的不解之处。

  • for循环后的向量包含5个对象。每个对象都指向otherClass的相同对象。
  • 删除一个对象后,将自动调用析构函数,并删除otherClass的对象。

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

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

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

这样,只从向量中删除第5个对象将删除otherClass的对象。

答案 1 :(得分:0)

  

如何准备类来处理动态分配的指针?我知道我需要重载复制构造函数,但是我是否还需要重载复制赋值?怎么样移动计划员或移动任务?

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

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