我的一位队友告诉我,我的代码中有内存泄漏
Base
{
public:
vector<Foo*> fooes;
};
Derived : public Base
{
public:
Derived ( )
{
for ( int i = 0 ; i < 10 ; i++ )
{
this.fooes.push_back ( new Foo() );
}
};
};
但他是一个非常忙碌的人,他无法帮助我,所以我问你,内存泄漏在哪里?我该如何解决?
据我了解,内存泄漏是我不删除由new Foo()
创建的对象,所以我只能向Base
添加析构函数,并清除fooes
向量,对吧? / p>
Base
{
public:
vector<Foo*> fooes;
~Base ( )
{
this->fooes.clear();
};
};
问题是:
这是正确的内存泄漏修复吗?
在Derived的析构函数之前是否会调用Base
的析构函数?
删除fooes
时是否会自动删除Base
垂直或我必须手动删除该班级的所有成员?
答案 0 :(得分:7)
1)这是正确的内存泄漏修复吗?
不,你必须遍历元素并手动delete
它们。
2)在Derived的析构函数之前是否会调用Base的析构函数?
否(假设您正在删除Derived
个对象)。
3)删除Base时是否会自动删除foos vector,或者我必须手动删除该类的所有成员?
是&amp;没有。矢量本身将被删除,因为它是自动管理的,其成员不会:
~Base ( )
{
for ( size_t i = 0 ; i < fooes.size() ; i++ )
delete fooes[i];
};
每个delete
和delete[]
分别应该有new
和new[]
。
更好的替代方法是使用智能指针。
答案 1 :(得分:3)
您需要迭代向量中的所有指针并在清除之前删除它们。向量将清除指针,但它不会清除它们指向的内存,除非您自己执行或更改向量以使用类似shared_ptr的内容。如果你的向量是一个对象的向量,那么你就不会有内存泄漏,但由于这些元素是通过new
分配的指针,你需要释放那个内存 - 向量不会自动执行它你。
答案 2 :(得分:1)
代码示例中没有内存泄漏,只是类定义。如果程序创建类型为Derived
的对象并将其销毁,则可能(见下文)是内存泄漏。但是,如果程序创建类型为Derived
的对象,则销毁它所拥有的所有Foo
个对象,然后删除原始对象,可能不会有内存泄漏。
内存泄漏很少能单独分析;它们是整个程序的属性。可以修改此类以删除Foo
个对象,但这可能会产生一个新的设计约束,而这个约束并非意图。例如,Foo
对象可能会在内部容器中注册自己,并要求所有此类对象一直持续到程序结束;鉴于该要求,删除Derived
的析构函数中的对象是错误的。
现在,这一切都很大程度上是假设的;我不会抱怨有人在增强Derived
的析构函数来删除所有Foo
个对象 - 这可能是正确的做法。但总有一点疑问......