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

问题描述 投票:0回答:2

我正在使用一个

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
对象分配内存,所以我不必释放与它们相关的内存,是吗?

我可以依赖系统正确清理内存吗?

c++ mfc
2个回答
3
投票

因为我没有为这些

CString
对象分配内存,所以我不必释放与它们相关的内存,是吗?

不,你没有。由于您自己没有为对象分配任何动态内存,因此您没有什么可以释放的。

创建一个

CString
会根据需要在内部为自己分配内存。当
CString
被销毁时,它会释放它分配的所有内存。

CStringList
添加字符串同样会根据需要在内部分配内存。当字符串从列表中删除,或者列表被销毁时,它将释放它分配的相关内存。

所有这些都是自动为您管理的。

我可以依赖系统正确清理内存吗?

如果您正确使用对象,通常是的。

只有在动态创建对象并且不销毁它们时才会发生泄漏。

您的示例似乎没有这样做,至少没有直接这样做。它在自动内存中创建

CString
/
List
对象,因此它们的生命周期由编译器管理,编译器将在它们超出范围时为您处理必要的清理工作。

但是,您的

m_ListOfSz
对象是一个类的成员。如果该类是动态创建的,那么如果该类对象没有被正确销毁,
m_ListOfSz
及其所有存储的
CString
s 可能会被泄露。您的帖子中没有足够的上下文来确定是否确实如此。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.