5

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

vector<Student*> vectorName;

为了进行正确的(?)内存管理,我在 Student 类中声明了析构函数,如下所示

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

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

4

3 回答 3

5

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

隐式调用销毁std::vector包含对象上的析构函数时,这意味着如果包含的对象Student*只是释放指针的空间,您必须手动执行您正在执行的操作,如果且仅当您不这样做时,这是正确的将相同的 Student* 存储在多个集合中。

所以总结一下:

  • Student*如果向量包含对它的唯一引用,则必须删除该对象。
  • 删除Student*集合中的 a 将使其他集合中指向它的指针无效,这将导致问题
  • 在共享学生的情况下,您必须找到一种方法来检查何时不再引用它(同时销毁向量),以便您可以安全地删除它。(请参阅智能指针,您也可以手动计算引用,但这将是重新发明轮子)
于 2012-11-13T16:53:59.153 回答
2

如果您分配了vectornamewith的项目new Student,那么是的。但是您必须记住,在此之后, a 指向的任何数据 都将vectorName.at(i)被销毁,并且不应在程序的其他地方访问。

于 2012-11-13T16:53:10.703 回答
2

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

vector<Student> vectorName;

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

vectorName.push_back(std::move(student));
vectorName.emplace_back("John", 42);
于 2012-11-13T16:56:50.223 回答