C++ 可能的内存泄漏?

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;

我对这个概念还不熟悉,所以不要对我太苛刻。 为什么这段代码不生成析构函数调用? 这些类的名称是不言自明的。 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;
}
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
“您必须手动删除智能指针本身”-或将其放入智能。。。哦,没关系;-)