gpt4 book ai didi

c++ - 关于内存泄漏的问题

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:50 25 4
gpt4 key购买 nike

#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 本身没有任何内存管理错误,此版本不会泄漏。


编辑:顺便说一句,您的程序是否:

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

关于c++ - 关于内存泄漏的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5886958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com