【发布时间】:2011-05-04 06:42:19
【问题描述】:
我在我的一个应用程序中使用 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*,但我在一个单独的小型程序中尝试过,并且作为父类删除会正确删除子成员变量(当然,这是有道理的)。
我在 VS 中使用了内存泄漏跟踪,它表明最终泄漏的字符串是我创建 Dialog 并将 objString 设置为作为引用传递的字符串时创建的字符串构造函数。
谢谢,
詹格勒
【问题讨论】:
-
(糟糕,我之前的评论在阅读运算符优先级时出现了错误)。我认为您需要显示更多代码。在没有看到
obj的定义和分配方式的情况下,很难推测obj->objString是否会被正确释放。 -
这里看起来很乱,所以我将用我的评论更新 OP。
-
Popup有虚拟析构函数吗? -
@Adam:太棒了!当我在我的 OP 中进行编辑时,我怀疑它没有进行正确的析构函数调用,但是当我尝试将析构函数设为虚拟时,我可能做错了。我现在试了一下,效果很好。我会接受你的回复;您介意在您的回复中提及这一点,以便它可以帮助可能遇到此问题的其他人吗?
标签: c++ c string memory memory-leaks