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

osk*_*osk 3 c++ memory destructor

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

我们有一个没有指针和类Car的类Person,如下所示:

class Car{
public:
  //stuff
private:
  Person* owner;
};
Run Code Online (Sandbox Code Playgroud)

然后是一个如下功能:

void f() {
  vector<Car> v;
  // do stuff with the vector
}
Run Code Online (Sandbox Code Playgroud)

当函数完成时,存在内存泄漏,为了修复它,课程资料建议通过向量中的每个Car并删除函数f()末尾的所有者指针.简单地为Car写一个析构函数是不够的,它会删除它的所有者以防止内存泄漏?

只需在Car类中添加:

~Car() {
  delete owner;
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*eyA 6

不,这肯定是不够的.你的班级是否正确遵守5的规则?即你有没有正确定义或删除复制构造函数,assingment操作符,移动构造函数和移动assingment?你真的准备好自己管理这个指针吗?

我有两个解决方案.

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