如果它是针对向量中的对象,是否会调用析构函数?
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。您是否正确定义或删除了复制构造函数、赋值运算符、移动构造函数和移动赋值?你真的准备好自己管理这个指针了吗?
我有两个解决方案给你。
- 根本不使用指针。从代码中不清楚为什么你需要一个指向
Person
的指针,而不是 Person
类型的对象。您是否以多态方式调用 Person
s 成员?除非必须,否则请使用非指针。
- 如果您确定需要指针,请使用自行管理的指针。
std::unique_ptr
应该是您的第一站,如果您确定需要共享所有权,请使用 std::shared_ptr
。
这是我课程中的作业,我很难理解背后的原因。
我们有一个 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。您是否正确定义或删除了复制构造函数、赋值运算符、移动构造函数和移动赋值?你真的准备好自己管理这个指针了吗?
我有两个解决方案给你。
- 根本不使用指针。从代码中不清楚为什么你需要一个指向
Person
的指针,而不是Person
类型的对象。您是否以多态方式调用Person
s 成员?除非必须,否则请使用非指针。 - 如果您确定需要指针,请使用自行管理的指针。
std::unique_ptr
应该是您的第一站,如果您确定需要共享所有权,请使用std::shared_ptr
。