我是这个概念的新手,所以不要对我太苛刻。
为什么这段代码不产生析构函数调用?
类的名称是不言自明的。
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_ptr
的 SString
的指针),它是悬空的......因为您不存储结果,您也不能为其调用 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/