如果它是针对向量中的对象,是否会调用析构函数?

Will a destructor be called if it is for an object in a vector?

这是我课程中的作业,我很难理解背后的原因。

我们有一个 class 没有指针的人和一辆 class 车如下:

class Car{
public:
  //stuff
private:
  Person* owner;
};

然后一个函数如下:

void f() {
  vector<Car> v;
  // do stuff with the vector
}

当函数完成时,存在内存泄漏,要修复它,课程 material 建议遍历向量中的每个 Car 并删除函数 f() 末尾的所有者指针.简单地为 Car 编写一个删除其所有者以防止内存泄漏的析构函数是否足够?

只需将其添加到 Car class:

~Car() {
  delete owner;
}

不,肯定是不够的。您的 class 是否正确地遵循了 5 的规则? IE。您是否正确定义或删除了复制构造函数、赋值运算符、移动构造函数和移动赋值?你真的准备好自己管理这个指针了吗?

我有两个解决方案给你。

  1. 根本不使用指针。从代码中不清楚为什么你需要一个指向 Person 的指针,而不是 Person 类型的对象。您是否以多态方式调用 Persons 成员?除非必须,否则请使用非指针。
  2. 如果您确定需要指针,请使用自行管理的指针。 std::unique_ptr 应该是您的第一站,如果您确定需要共享所有权,请使用 std::shared_ptr