当向量在内部类中时,如何删除指向对象的向量指针

Posted

技术标签:

【中文标题】当向量在内部类中时,如何删除指向对象的向量指针【英文标题】:How to delete vectors pointer to object, when vector is in inner class 【发布时间】:2013-11-11 16:10:11 【问题描述】:

我正在尝试完全删除包含指针引用的向量。

我已经在 *** 中找到了关于这个的线程,但是我有一点不同的情况,我相信,当其他人阅读这个问题时,这会让他们受益。

我的类中有内部类,以隐藏初始化和变量的实现。因此,当我尝试使用它时,我必须创建指向向量的指针。在这里,我编写了如何从向量中完全删除这些对象并清理向量本身的方法:

   void Program::deleteAll()
      vector<Category> *ptr = &(impl->categories);
      vector<Category>::iterator it;
      for (it = ptr->begin(); it != ptr->end(); )
         delete *it;  
         it = ptr->erase(it);
         it++;
      
   

问题就在这里:删除 *it。我在这里得到一个错误。在这个循环中如何删除存储为对象指针的对象?我可以告诉你,我如何将对象归入矢量类别:

   void Program::addCategory(string name)
      vector<Category> *ptr = &(impl->categories);
      Category cat(name);
      ptr->push_back(cat);
   

【问题讨论】:

Categorytypedef 的指针吗?如果没有,那么您不应该删除它。 @juanchopanza:如果是的话,应该改成shared_ptr的typedef,还是不要手动删除。但是从Category cat(name);我们可以看出它不是。 @juanchopanza - 不是真的,不。我必须删除它们才能完全删除对象,否则,在调用并完成析构函数后,对象不会被删除,这不是一件好事! 只有当它们是指向动态分配对象的指针并且删除它们是你的工作时,你才需要删除它们。看起来您不必删除任何内容。只需致电ptr-&gt;clear(); @Fractal:你只有deletenew 创建的东西。您还没有在此处使用new 创建任何内容。 【参考方案1】:

就这么简单

void Program::deleteAll()

   impl->categories.resize(0);

每个Category 对象的析构函数将被std::vector 调用,因此Category 中的任何指针都将被清除。

【讨论】:

以上是关于当向量在内部类中时,如何删除指向对象的向量指针的主要内容,如果未能解决你的问题,请参考以下文章

我是不是正确删除了指向对象的指针向量?

如何从 C++ 中的“指向对象的指针”向量访问对象

何时使用向量中的对象以及何时使用指向向量中对象的指针? [关闭]

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

如何计算指向不同向量数组中特定对象的指针的出现次数

如果已删除,如何从向量中删除对象