繁体   English   中英

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

[英]C/C++ string memory leaks?

我在我的应用程序中使用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设置为作为对构造函数的引用传递的字符串。

谢谢,
Jengerer

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

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

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


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

问题很可能不是在std::string ,而是在obj (无论是什么类型)。 请注意,您删除了obj ,而不是cppString 我的猜测是obj不会在智能指针类中存储objString ,也不会在析构函数中删除objString ,因此你就有了这个漏洞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM