在指针向量中释放内存的正确方法? (C ++)

时间:2012-11-13 16:47:51

标签: c++

我有一个家庭作业问题,其中我有class Student,以及指向Student个对象的指针向量,它是Student类中的成员字段:

vector<Student*> vectorName;

为了做正确的(?)内存管理,我在Student类中声明了这样的析构函数

Student::~Student() {
  for(int i=0; i<vectorName.size(); i++){
    delete vectorName.at(i);
  }
}

真的是否正确地从堆中释放内存,还是有更好的方法?

3 个答案:

答案 0 :(得分:5)

这主要取决于存储Student*个引用的位置。如果Student*实例的个人学生列表中没有任何其他地方的参考,那么您正在做的事情会产生许多悬空指针。

当销毁std::vector包含的对象上的析构函数被隐式调用时,这意味着如果包含的对象是Student*,那么只释放指针的空间,你必须手动执行你的操作正在做的是正确的如果你没有将同一个学生*存放在多个馆藏中,那就是

总结一下:

  • 如果向量包含对它的唯一引用,则必须删除Student*对象。
  • 删除集合中的Student*将导致其他集合中指向它的指针无效,这将导致问题
  • 在共享学生的情况下,您必须找到一种方法来检查何时没有更多的引用(同时销毁向量),以便您可以安全地删除它。 (参见智能指针,您也可以手动计算参考值,但这将重新发明轮子)

答案 1 :(得分:2)

如果您使用vectorname分配了new Student项,那么是。但是你必须记住,在这一点之后,vectorName.at(i)所指向的任何数据都会被销毁,并且不应该在程序的其他地方访问。

答案 2 :(得分:2)

如果向量拥有学生(也就是说,它负责删除它们),根本不要使用指针(除非你需要多态性,但你没有在问题中说明,所以我假设你不要T)。如果这样做,则不需要再显式定义dtor,copy ctor和copy assignment操作符;请参阅Rule of Zero

vector<Student> vectorName;

如果您不希望在向量中插入对象时复制对象的开销,请移动它们或使用emplace_back

vectorName.push_back(std::move(student));
vectorName.emplace_back("John", 42);