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