我是这个概念的新手,所以不要对我太苛刻。
为什么这段代码不产生析构函数调用?
类的名称是不言自明的。
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;
}

这是内存泄漏吗?
实现。 smart_ptr 来自 here

编辑:
//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;
    }

最佳答案

通过 new smart_ptr<SString>(new SString("but lost")); 您正在创建一个新的、动态分配的智能指针。您不会在任何地方存储分配的结果(指向 shared_ptrSString 的指针),它是悬空的......因为您不存储结果,您也不能为其调用 delete - 因此它的析构函数不会' t 被调用,反过来也不会调用包含对象的 SString 析构函数!

如果你试试

smart_ptr<SString> *p = new smart_ptr<SString>(new SString("but lost"));
delete p;

相反,您会看到在这种情况下也调用了析构函数。

但是,这不是smart_ptr的明智使用。创建 smart_ptr 以便您 不需要 手动调用 delete;因此,不要那样使用它们;像在你的第一个声明中一样使用它们!

关于c++ - 可能内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12426473/

10-13 01:14