C++ MFC CStringList -内存清理,可能的内存泄漏

fykwrbwg  于 2023-03-25  发布在  其他
关注(0)|答案(2)|浏览(298)

我正在使用一个CStringList对象。我想知道我的代码是否会因为我如何操作这个列表而导致内存泄漏。
我有一个类成员变量:
CStringList m_ListOfSz;
我使用AddTail()函数将CString对象添加到列表中:

CString sz1 = "A string 1";
CString sz2 = "A string 2";
m_ListOfSz.AddTail(sz1);
m_ListOfSz.AddTail(sz2);

在程序中的某个时刻,我使用RemoveAll()函数删除添加到列表中的所有CString对象。
因为我没有为这些CString对象分配内存,所以我不需要释放与它们相关的内存,或者我需要吗?
我可以依靠系统正确地清理内存吗?

zzzyeukh

zzzyeukh1#

因为我没有为这些CString对象分配内存,所以我不需要释放与它们相关的内存,或者我需要吗?
不需要。因为您自己没有为对象分配任何动态内存,所以没有任何东西需要释放。
创建一个CString将根据需要在内部为自己分配内存。当CString被销毁时,它将释放它分配的所有内存。
CStringList添加字符串同样会根据需要在内部分配内存。当字符串从列表中删除时,或者列表被销毁时,它会释放已经分配的相关内存。
所有这些都是自动为您管理的。
我可以依靠系统正确地清理内存吗?
通常是的,如果您正确使用对象。
只有在动态创建对象并且不销毁它们的情况下才会发生泄漏。
您的示例似乎没有这样做,至少没有直接这样做。它在自动内存中创建CString/List对象,因此它们的生存期由编译器管理,当它们超出范围时,编译器将为您处理必要的清理。
然而,你的m_ListOfSz对象是一个类的成员。如果这个类是动态创建的,那么如果这个类对象没有被正确销毁,m_ListOfSz和它存储的所有CString s * 都可能 * 被泄露。你的帖子中没有足够的上下文来确定实际情况是否如此。

db2dz4w8

db2dz4w82#

CString对象实际上分配内存来存储字符串内容(“缓冲区”)。这些内存由它们的析构函数释放。此外,CStringList析构函数将销毁列表中的项。所以回答你的问题,不,你不需要自己释放任何东西,当CStringList对象超出范围时,它们都会被释放(或者调用delete,如果它是通过调用new创建的)。

相关问题