C++ 可能的内存泄漏?
我对这个概念还不熟悉,所以不要对我太苛刻。 为什么这段代码不生成析构函数调用? 这些类的名称是不言自明的。 SString将在~SString()中打印消息。 它只打印一条析构函数消息C++ 可能的内存泄漏?,c++,oop,visual-c++,C++,Oop,Visual C++,我对这个概念还不熟悉,所以不要对我太苛刻。 为什么这段代码不生成析构函数调用? 这些类的名称是不言自明的。 SString将在~SString()中打印消息。 它只打印一条析构函数消息 int main(int argc, TCHAR* argv[]) { smart_ptr<SString> smt(new SString("not lost")); new smart_ptr<SString>(new SString("but lost")); return 0;
int main(int argc, TCHAR* argv[])
{
smart_ptr<SString> smt(new SString("not lost"));
new smart_ptr<SString>(new SString("but lost"));
return 0;
}
intmain(intargc,TCHAR*argv[])
{
智能ptr smt(新串(“未丢失”);
新智能ptr(新串(“但丢失”);
返回0;
}
这是内存泄漏吗?
impl。对于smart,ptr来自
编辑:
//copy ctor
smart_ptr(const smart_ptr<T>& ptrCopy)
{
m_AutoPtr = new T(ptrCopy.get());
}
//overloading = operator
smart_ptr<T>& operator=(smart_ptr<T>& ptrCopy)
{
if(m_AutoPtr)
delete m_AutoPtr;
m_AutoPtr = new T(*ptrCopy.get());
return *this;
}
//复制
smart_ptr(const smart_ptr&ptrCopy)
{
m_AutoPtr=newt(ptrCopy.get());
}
//重载=运算符
智能检查与操作员=(智能检查与复印)
{
如果(m_AutoPtr)
删除m_AutoPtr;
m_AutoPtr=newt(*ptrCopy.get());
归还*这个;
}
是的,智能点本身泄漏。(以及它提到的任何东西)
我想不出一个好的理由来new
智能指针…通过new smart\u ptr(new SString(“但丢失”)代码>您正在创建一个新的、动态分配的智能指针。分配结果(指向shared\u ptr
的指针指向SString
)不会存储在任何地方,而是挂起。。。由于不存储结果,因此也不能为其调用delete
——因此不会调用它的析构函数,反过来也不会调用所包含对象的SString
析构函数
如果你尝试
smart_ptr<SString> *p = new smart_ptr<SString>(new SString("but lost"));
delete p;
smart_ptr*p=新的smart_ptr(新的字符串(“但丢失”));
删除p;
相反,您将看到在这种情况下也调用了析构函数
然而,使用智能ptr
是不明智的<代码>智能ptr
已创建,因此您无需手动调用删除
;因此,不要这样使用它们;在你的第一句话中使用它们 智能指针的要点是,您应该只有自动智能指针对象:
{
smart_ptr<Foo> p(new Foo);
}
// bye bye Foo
{
smart_ptr p(新Foo);
}
//再见,福
然而,您的第二行创建了一个动态智能指针,它的生命永远不会结束!因此,它永远没有机会摧毁它负责的对象
您必须手动删除智能指针本身,以便它可以依次清理对象:
auto sp = new smart_ptr<Foo>(new Foo);
// ^^^^^^^
// ^^^^^^^^^^^^^^ +------< dynamic Foo, handled by the SP
// |
// +---------------< dynamic smart pointer, handled by YOU
delete sp;
auto sp=new smart\u ptr(新的Foo);
// ^^^^^^^
//^^^^^^^^^+----<动态Foo,由SP处理
// |
//+-----------<动态智能指针,由您处理
删除sp;
是的,这是内存泄漏,您正在泄漏第二个智能指针及其内容
原因是第一个智能指针是在堆栈上创建的,因此它的生命周期限定在它声明的块的范围内,之后它将自动销毁
第二个是在堆上创建的,这意味着它将一直存在,直到你用
delete
销毁它,此时它的析构函数将被调用(并且用它持有的SString
的析构函数)。什么是新的'd,必须是delete
'd。动态内存没有存储任何地方。。。!!!无论您做什么,除了学习练习之外,不要将该实现用于任何其他用途。即使在更正了过时的头名称并修复了明显的错误之后,它的复制语义也被彻底破坏了。在真实代码中使用std::unique_ptr
和std::shared_ptr
。我注意到它的复制语义被破坏了,但是如果我以以下方式更改它们,这是否足以在生产环境中使用呢?或者在哪里可以找到完整正确的实现?@LCDFire:您需要删除而不是免费,检查空值后,复制将是new T(*ptrCopy)
,如果对象实际上是T
的子类型,您将切片该对象。要让智能指针正确复制其目标是相当棘手的,这就是为什么标准库只提供不可复制的唯一\u ptr
和引用计数共享\u ptr
“您必须手动删除智能指针本身”-或将其放入智能。。。哦,没关系;-)