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
对象分配内存,所以我不必释放与它们相关的内存,是吗?
我可以依赖系统正确清理内存吗?
因为我没有为这些
对象分配内存,所以我不必释放与它们相关的内存,是吗?CString
不,你没有。由于您自己没有为对象分配任何动态内存,因此您没有什么可以释放的。
创建一个
CString
会根据需要在内部为自己分配内存。当 CString
被销毁时,它会释放它分配的所有内存。
向
CStringList
添加字符串同样会根据需要在内部分配内存。当字符串从列表中删除,或者列表被销毁时,它将释放它分配的相关内存。
所有这些都是自动为您管理的。
我可以依赖系统正确清理内存吗?
如果您正确使用对象,通常是的。
只有在动态创建对象并且不销毁它们时才会发生泄漏。
您的示例似乎没有这样做,至少没有直接这样做。它在自动内存中创建
CString
/List
对象,因此它们的生命周期由编译器管理,编译器将在它们超出范围时为您处理必要的清理工作。
但是,您的
m_ListOfSz
对象是一个类的成员。如果该类是动态创建的,那么如果该类对象没有被正确销毁,m_ListOfSz
及其所有存储的 CString
s 可能会被泄露。您的帖子中没有足够的上下文来确定是否确实如此。
CString
对象确实分配内存来存储字符串内容(“缓冲区”)。该内存由它们的析构函数释放。此外,CStringList
析构函数将销毁其在列表中的项目。所以要回答你的问题,不,你不需要自己释放任何东西,当CStringList
对象超出范围时它们都会被释放(或者你调用delete
,如果它是通过调用new
创建的).