C++ 使用std::string的内存泄漏

C++ 使用std::string的内存泄漏,c++,string,memory-leaks,C++,String,Memory Leaks,以下代码: #include <string> void *ptr = nullptr; std::string *p = new std::string(); *p = "1"; ptr = p; delete ptr; 知道我做错了什么吗? 我需要使用void*指针,因为它可能会保留不同类型的对象。 非常感谢那些能帮助我的人!!!: 假设你的意思是ptr=p 如果传递要删除的void*,则不会调用析构函数。 编译器甚至无法知道是否存在,因此无法调用它 由于

以下代码:

#include <string>

void *ptr = nullptr;
std::string *p = new std::string();
*p = "1";
ptr = p;
delete ptr;
知道我做错了什么吗? 我需要使用void*指针,因为它可能会保留不同类型的对象。 非常感谢那些能帮助我的人!!!:

假设你的意思是ptr=p

如果传递要删除的void*,则不会调用析构函数。 编译器甚至无法知道是否存在,因此无法调用它

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


您需要保持适当的指针,无论是通过模板、Booo::任何,一个具有虚拟析构函数的公共基类,或手动记帐。

< P>根据C++标准

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

在脚注中进一步写道

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


因此,程序的行为是未定义的。std::string类型的对象的析构函数和运算符函数delete都没有被调用,因为对象的大小未知。

C++处理不同类型的方法比void*更好。例如,@ RieldLime:我从C++开始。如果你能给其他类型的线索,而不是void*的使用,这将是伟大的!这毫无意义:ptr=*p;。这甚至不应该编译。关于工作原理,int有最简单的析构函数,没有。对于std::string,情况并非如此。不要使用空指针。为安全键入建立了C++,Vaul**消除了这一点。根据需要解决的问题,您有一些选项,如Booo::我以前提到过的任何一个,继承甚至模板。如果没有关于你具体案例的更多信息,我真的无法推荐最好的选择。奇怪的是,这个答案没有提到模板。当然,模板是这里显而易见的惯用解决方案,除非我们知道它们不能在需要时使用。几乎可以肯定的是,这将比提出的所有其他机制更好地解决OP的问题。@Konrad Rudolph:我确实提到了模板。@KonradRudolph这并不奇怪,是衰老。谢谢你的回答,让我理解了这个问题!
void *ptr = nullptr;
int *p = new int();
*p = 1;
ptr = p;
delete ptr;