我在我的应用程序中使用STL string
,最近在测试内存泄漏时发现了一个问题,我注意到很多字符串在程序结束时没有被正确地释放。
我使用以下代码(并非逐字翻译)测试其中一个字符串:
const string* cppString = &obj->objString;
const char* cString = cppString->c_str();
delete obj;
在此之后,我设置了断点并注意到,虽然
cppString
指向的string
已经不存在了,但cString
仍然指向一个C风格的字符串,这个字符串显然无法在最后被释放。我是否对C/C++字符串的工作方式有所遗漏?如何使C字符串表示也被释放?
我的
obj
类是Dialog
类型,继承自Popup
。我认为可能是这个原因,因为当我删除obj
时,我将其视为Popup*
处理,但我在一个小的独立程序中尝试过,按父类删除可以正确地删除子成员变量(当然这是有道理的)。我在Visual Studio中使用了内存泄漏跟踪功能,它显示最终泄漏的字符串是在我创建
Dialog
并将objString
设置为传递给构造函数的字符串时创建的。
obj
的定义以及它的分配方式,很难推测obj->objString
是否会被正确释放。 - Steve JessopPopup
有虚析构函数吗? - Adam Rosenfield