内存泄漏与std :: string

Eus*_*ono -4 c++ string memory-leaks

以下代码:

#include <string>

void *ptr = nullptr;
std::string *p = new std::string();
*p = "1";
ptr = p;
delete ptr;
Run Code Online (Sandbox Code Playgroud)

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

21:检测到内存泄漏!

21:转储对象 - >

21:{706}正常块,位于0x00723860,长度为8个字节.

21:数据:<q> C8 04 71 00 00 00 00 00

21:对象转储完成.

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

void *ptr = nullptr;
int *p = new int();
*p = 1;
ptr = p;
delete ptr;
Run Code Online (Sandbox Code Playgroud)

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

mol*_*ilo 6

(假设你的意思ptr = p).

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

由于std::string内部保存动态分配的缓冲区,因此如果未调用析构函数,则会泄漏该缓冲区.

您需要通过模板,boost::any带有虚拟析构函数的公共基类或手动簿记来维护"正确"指针.