[英]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.