关于内存泄漏的问题
A question about memory leaks
#include <QList>
class MyType{
//This has some data in it....
};
QList<MyType> f()
{
QList<MyType> list;
for(int i = 0; i<10; i++ )
{
MyType* item = new MyType();
list << *item;
}
return list;
}
QList<MyType> temp_var = f();
当temp_var超出作用域并销毁时,我们创建并添加到该列表中的项会发生什么?会有内存泄漏吗?
谢谢。
是的,会有内存泄漏。作为一般规则,程序中的每个new
必须对应一个delete
。
在你的具体情况下,错误的逻辑发生早于temp_var
的破坏。您分配项目,然后将这些项目的副本存储在列表中。你应该立即销毁原来的、不再有用的物品。
for循环可以是:
for(int i = 0; i<10; i++ )
{
MyType* item = new MyType(); // get me an item.
list << *item; // put copy of item in list
delete item; // destroy my item
}
当以这种方式表达时,很明显我们根本不应该使用new
!
for(int i = 0; i < 10; i++)
{
MyType item;
list << item;
}
这个版本不会泄漏,假设MyType
本身没有任何内存管理错误。
EDIT:作为题外话,如果您的程序是:
QList<MyType*> f() // List of POINTERS
{
QList<MyType*> list;
for(int i = 0; i<10; i++ )
{
MyType* item = new MyType();
list << item; // Storing a POINTER
}
return list;
}
那么,是的,您将得到您所期望的内存泄漏。QList
不会自动提供指针类型的delete
。
我不认为在你的代码中使用new
有任何意义,因为你不是在列表中存储指针,而是用new创建的对象的副本,而且你没有删除它。所以,函数本身存在内存泄漏。
看到QList
不是指针列表,我可以说你不应该在你的代码中使用new
:
QList<MyType> f()
{
QList<MyType> list; //note : its not a list of MyType*
for(int i = 0; i<10; i++ )
{
MyType item; //automatic variable
list << item;
}
return list;
}
当QList被销毁/超出作用域时,它也会同时销毁它的内容。在您的例子中,内容是由对象的副本组成的(从隐式复制构造函数构建),而不是对象本身。内存将在for循环的每次迭代中泄漏,因为new MyType()
创建的原始对象将丢失其指针,但仍将保持分配。
如果你不删除你用new MyType()
创建的所有项目,肯定会有泄漏!
在QList
的析构函数中,您需要遍历列表并对每个项调用delete。
相关文章:
- 这个极客对极客的trie实现是否存在内存泄漏问题
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 内存泄漏问题
- 我在内存泄漏和字符串方面遇到了一个非常奇怪的问题
- 存在内存泄漏问题的链接列表
- 如何解决C++代码中的内存泄漏问题
- 检查内存泄漏问题
- 解决将对象传递给抛出的函数时可能出现的内存泄漏问题
- 此代码是否会导致内存泄漏问题
- 'Resource Acquisition Is Initialization'解决内存泄漏问题
- 如果对象将在消息处理程序中使用,如何解决内存泄漏问题
- C++内存泄漏问题
- 内存泄漏问题c++程序
- 将wchar_t打印到控制台时存在内存泄漏问题
- GStreamer内存泄漏问题
- c++又是一个内存泄漏问题
- 内存泄漏问题
- 内存泄漏问题
- timer_create "Syscall param timer_create(evp) points to uninitialised byte(s)"内存泄漏问题
- 无法发现下面代码中的内存泄漏问题