C/C++字符串内存泄漏?

Jen*_*rer 8 c c++ memory string memory-leaks

我在我string的应用程序中使用STL ,我最近测试它是否存在内存泄漏,我注意到我的很多字符串在程序结束时没有被正确释放.

我用其中一个字符串测试了下面的代码(不是逐字):

const string* cppString = &obj->objString;
const char* cString = cppString->c_str();
delete obj;
Run Code Online (Sandbox Code Playgroud)

在那之后,我把一个破发点,并注意到,虽然stringcppString指向不再存在,cString仍然指向C风格的字符串,这肯定不够的,是未能在年底被释放的人.

我是否遗漏了C/C++字符串的工作方式?如何才能获取要解除分配的字符串的C表示?

编辑:更多信息.我的obj类是Dialog继承的类型Popup.我认为这可能是它,因为当我删除时obj,我将其视为一个Popup*,但我在一个小的单独程序中尝试它,并删除作为父类正确删除子成员变量(这是有道理的,课程).

我在VS中使用了内存泄漏跟踪,它显示最终泄漏的字符串是我创建时创建的字符串,Dialog并设置objString为作为对构造函数的引用传递的字符串.

谢谢,
Jengerer

Ada*_*eld 8

您所看到的是未定义的行为 - 实际上并不是内存泄漏.C字符串的内存被释放(至少就您而言),但那里的数据仍然可以在技术上访问.当您释放内存时,内存通常不会被擦除,因此只要内存不被后续分配重用,数据就会一直存在.

在取消分配数据之后读取数据是未定义的行为:您可能会在数据被取消分配之前得到数据,您可能会获得垃圾数据,可能会导致程序崩溃,或者甚至可能擦除您的硬盘驱动器(尽管这不太可能).

只要std::string对象被正确释放,那么用于其C字符串表示的任何内存也将被释放.你不必担心这一点.


编辑:事实上,事实证明你的对象没有被破坏,因为父类Popup没有虚拟析构函数.结果,子类的析构函数Dialog没有被调用,因此std::string实例的析构函数没有被调用.