【发布时间】:2016-06-20 23:28:50
【问题描述】:
几天前我看到一个关于 C++ 内存泄漏的面试问题。 代码是这样的(如果我没记错的话):
#include <iostream>
using namespace std;
class super {
int value;
int arr[1000];
public:
super() :value(0) {}
super(int value) :value(value) {}
virtual int getValue() const{
return this->value;
}
};
class sub : public super {
int val;
super sup;
vector<int> v1;
public:
sub() :val(0), sup(0) {}
sub(int value) :val(value), sup(value), v1(10,0) {}
int getValue() const{
return this->val;
}
};
int main() {
sub* pt1 = new(sub);
super* pt2 = pt1;
pt1 = new(sub);
delete pt2; //memory leak ??
//more code here...
delete pt1;
return 0;
}
问题是如何在实现设计级别避免这种类型的内存泄漏。我想这个问题不仅仅是简单地回答“不要使用那样的指针”。
它是否与将析构函数实现为虚拟或使用动态转换有关?我们如何实现析构函数以使delete pt2 不会造成任何内存泄漏?谁能进一步分析这个例子?
提前致谢。
【问题讨论】:
-
我不明白这是如何泄漏内存的。您正在通过指向其基类的指针删除第一个
sub对象,这应该没问题,因为sub不包含任何资源。如果是这样,您必须在super中声明一个虚拟析构函数。 -
我猜这里缺少虚拟析构函数见stackoverflow.com/questions/461203/…
-
@RolandW 是的,我不记得该示例的确切代码。随意编辑问题中的代码,以便子类可以保存资源。
-
只需将
ar更改为向量即可。当将 sub 转换为 super 并删除它时,super dtor 不会调用 sub dtor 不会调用不会释放动态内存的 ar/vector dtor -> 内存泄漏。 -
@Youka 现在可以了吗?
标签: c++ object inheritance memory-management memory-leaks