内存泄漏与std :: string

时间:2014-06-17 09:15:59

标签: c++ string memory-leaks

以下代码:

#include <string>

void *ptr = nullptr;
std::string *p = new std::string();
*p = "1";
ptr = p;
delete ptr;

似乎通过以下输出使内存泄漏:

  

21:检测到内存泄漏!

     

21:倾倒对象 - &gt;

     

21:{706}正常阻塞位于0x00723860,长度为8个字节。

     

21:数据:&lt; q&gt; C8 04 71 00 00 00 00 00

     

21:对象转储完成。

这很奇怪,因为以下代码没有显示错误(也适用于 double bool ):

void *ptr = nullptr;
int *p = new int();
*p = 1;
ptr = p;
delete ptr;

知道我做错了什么? (我需要使用&#34; void *&#34;指针,因为它可能会保留不同类型的对象)。 非常感谢那些可以帮助我的人! :)

2 个答案:

答案 0 :(得分:6)

(假设你的意思是ptr = p)。

如果您将void *传递给delete,则不会调用析构函数 (编译器甚至无法知道是否有一个,因此无法调用它。)

由于std::string内部拥有一个动态分配的缓冲区,如果没有调用析构函数,该缓冲区就会泄露。

你需要保持&#34;正确的&#34;指针,通过模板,boost::any,带有虚拟析构函数的公共基类,或手动记账。

答案 1 :(得分:1)

根据C ++标准

  

操作数应该是指向对象类型或类类型的指针。如果   类类型,操作数是在上下文中隐式转换的(子句   4)指向对象类型的指针。

在脚注中还写着

  

81)这意味着无法使用指针删除对象   type void *因为void不是对象类型。

所以程序的行为是未定义的。既不调用类型为std::string的对象的析构函数,也不调用操作符函数delete,因为对象的大小未知。