以下代码:
#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;指针,因为它可能会保留不同类型的对象)。 非常感谢那些可以帮助我的人! :)
答案 0 :(得分:6)
(假设你的意思是ptr = p
)。
如果您将void *
传递给delete
,则不会调用析构函数
(编译器甚至无法知道是否有一个,因此无法调用它。)
由于std::string
内部拥有一个动态分配的缓冲区,如果没有调用析构函数,该缓冲区就会泄露。
你需要保持&#34;正确的&#34;指针,通过模板,boost::any
,带有虚拟析构函数的公共基类,或手动记账。
答案 1 :(得分:1)
根据C ++标准
操作数应该是指向对象类型或类类型的指针。如果 类类型,操作数是在上下文中隐式转换的(子句 4)指向对象类型的指针。
在脚注中还写着
81)这意味着无法使用指针删除对象 type void *因为void不是对象类型。
所以程序的行为是未定义的。既不调用类型为std::string
的对象的析构函数,也不调用操作符函数delete,因为对象的大小未知。