我在C ++社区中待了一段时间,听到原始指针“很邪恶”,应尽可能避免使用它们。在原始指针上使用智能指针的主要原因之一是“防止”内存泄漏。所以我的问题是:即使使用智能指针,是否仍有可能发生内存泄漏?如果是,那怎么可能?
即使使用智能指针,是否仍然可能发生内存泄漏?
是的,如果您不小心避免在引用中创建循环。
如果是,那怎么可能?
当与对象关联的引用计数降至零时,基于引用计数的智能指针(例如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] 删除。
我来说两句