c++ - 在删除指向动态分配对象的指针 vector 中的元素之前,我需要做什么?

标签 c++ pointers memory-management memory-leaks vector

我有一个 vector ,我用指向对象的指针填充。我正在努力学习良好的内存管理,并且有几个一般性问题:

  1. 当我完成 vector 后,是否必须循环遍历它并在每个指针上调用 delete?
  2. 为什么我不必在没有 new 语句的情况下对 vector 或我声明的任何其他变量调用 delete,但必须对指针调用 delete?
  3. 如果 vector 在返回的函数中声明(导致 vector 超出范围),C++ 是否会为我释放指针的内存?

最佳答案

  1. 是的
  2. vector 是使用模板内存分配器实现的,该分配器会为您处理内存管理,因此它们有些特殊。但作为一般经验法则,由于堆栈和堆分配之间的差异,您不必对未使用 new 关键字声明的变量调用 delete .如果在堆上分配了东西,则必须将其删除(释放)以防止内存泄漏。
  3. 没有。在遍历所有元素时,您必须明确调用 delete myVec[index]

例如:

for(int i = 0; i < myVec.size(); ++i)
   delete myVec[i];

话虽如此,如果您打算将指针存储在 vector 中,我强烈建议使用 boost::ptr_vector它会自动处理删除。

关于c++ - 在删除指向动态分配对象的指针 vector 中的元素之前,我需要做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4061438/

相关文章:

c++ - 如何在C++中获取字符串中的输入?

c++ - 使用ifstream时OpenGL版本太低

c - 警告 : cast from pointer to integer of different size [-Wpointer-to-int-cast]

c - long, char 指针的指针运算

c++ - 导致神秘暂停的内存分配器

ios - 关于内存消耗 : Why choose static let over (computed) static var?

c++ - QDataStream没有这样的方法,为什么可以将QVariant写入QDataStream?

c++ - 将指向数据成员的指针传递给基类构造函数是否安全?

c++ - std::vector 指针 - 表达式必须有类类型错误

memory-management - forrtl : severe (179): Cannot allocate array - overflow on array size calculation