带有智能指针的可能的内存泄漏

法拉·库利巴利

我在C ++社区中待了一段时间,听到原始指针“很邪恶”,应尽可能避免使用它们。在原始指针上使用智能指针的主要原因之一是“防止”内存泄漏。所以我的问题是:即使使用智能指针,是否仍有可能发生内存泄漏?如果是,那怎么可能?

杰里米·弗里斯纳(Jeremy Friesner)

即使使用智能指针,是否仍然可能发生内存泄漏?

是的,如果您不小心避免在引用中创建循环。

如果是,那怎么可能?

当与对象关联的引用计数降至零时,基于引用计数的智能指针(例如shared_ptr)将删除指向对象的指针。但是,如果您的引用中有一个循环(A-> B-> A,或更复杂的循环),则该循环中的引用计数将永远不会降为零,因为智能指针可以“使彼此保持活动状态”。

这是一个简单程序的示例,尽管仅使用了shared_ptr作为其指针,但该程序仍会泄漏内存。请注意,当您运行它时,构造函数会打印一条消息,但析构函数永远不会执行以下操作:

#include <stdio.h>
#include <memory>

using namespace std;

class C
{
public:
   C() {printf("Constructor for C:  this=%p\n", this);}
   ~C() {printf("Destructor for C:  this=%p\n", this);}

   void setSharedPointer(shared_ptr<C> p) {pC = p;}

private:
   shared_ptr<C> pC;
};

int main(int argc, char ** argv)
{
   shared_ptr<C> pC(new C);
   shared_ptr<C> pD(new C);

   pC->setSharedPointer(pD);
   pD->setSharedPointer(pC);

   return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用智能指针时发生内存泄漏

来自分类Dev

带有智能指针的Swig类型图

来自分类Dev

使用带有智能指针的吸气剂

来自分类Dev

释放智能指针中的内存

来自分类Dev

具有addrinfo结构的智能指针

来自分类Dev

具有addrinfo结构的智能指针

来自分类Dev

具有智能指针的C ++智能向量?

来自分类Dev

使用智能指针时如何跟踪内存分配

来自分类Dev

使用智能指针时如何跟踪内存分配

来自分类Dev

智能指针实现

来自分类Dev

智能指针+循环+“->”

来自分类Dev

智能指针的语法

来自分类Dev

智能指针的概念

来自分类Dev

智能指针实现

来自分类Dev

智能指针+循环+“->”

来自分类Dev

智能指针模板

来自分类Dev

如何创建一个带有嵌入式切片的无指针类型的智能指针?

来自分类Dev

获取智能指针的指针

来自分类Dev

使用智能指针有什么问题?

来自分类Dev

.get()和->与智能指针之间有区别吗?

来自分类Dev

.get()和->与智能指针之间有区别吗?

来自分类Dev

如何防止没有智能指针的双重删除?

来自分类Dev

指向智能指针托管阵列中的智能指针

来自分类Dev

当我获得指向智能指针的指针时,是否需要释放内存?

来自分类Dev

当我获得一个指向智能指针的指针时,是否需要释放内存?

来自分类Dev

多态智能指针的用法

来自分类Dev

智能指针的效率如何?

来自分类Dev

静态智能指针-是或否?

来自分类Dev

->在智能指针中的用法