带有std::string的内存泄漏

Memory leak with std::string

本文关键字:内存 泄漏 string std 带有      更新时间:2023-10-16

以下代码:

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

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

21: Detected memory leaks!

21:转储对象->

21:{706}正常块位于0x00723860, 8字节长。

21: Data: <问在C8 _x0030_4=" _x0037_1=" _x0030_00=">

21: Object dump complete.

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

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

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

(假设您指的是ptr = p)。

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

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

您需要通过模板、boost::any(带有虚析构函数的公共基类)或手动记账来维护"适当的"指针。

根据c++标准

操作数必须是指向对象类型或类类型的指针。如果的类类型时,操作数被上下文隐式转换(子句)4)指向对象类型的指针

在脚注中还写着

81)这意味着不能使用的指针删除对象键入void*,因为void不是对象类型。

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