一、原理
为了避免new了对象后忘记delete,或者对象的销毁时机不确定,通过shared_ptr可以自动销毁没有被引用的对象。
二、注意点
shared_ptr并不能解决循环引用的问题,如果有循环引用,不能自动delete指向的对象。
shared_ptr 线程不安全
三、测试
#pragma once
#include <memory>
#include <iostream>
using namespace std;
class SharedPtrClass
{
public:
int a;
bool sharedPtr;
shared_ptr<SharedPtrClass> t;
SharedPtrClass(bool sharedPtr)
{
this->sharedPtr = sharedPtr;
cout << "SharePrtClass new" << (sharedPtr?" sharedPtr":" class")<< endl;
}
~SharedPtrClass()
{
cout << "SharePtrClass free " << (sharedPtr?" sharedPtr":" class") << endl;
}
};
class SharedPtr
{
public:
void doTest()
{
cout << "autoDelete before" << endl << endl;
autoDelete();
cout << "autoDelete exit" << endl << endl;
cout << endl << endl << endl;
cout << "circularRef before" << endl << endl;
circularRef();
cout << "circularRef exit" << endl << endl;
}
void autoDelete()
{
cout << "autoDelete class start1" << endl;
SharedPtrClass* a = new SharedPtrClass(false); //没有主动delete,函数退出时,并不会a指向的对象,导致内存泄漏
cout << "autoDelete class end1" << endl;
cout << endl;
cout << "autoDelete shared_ptr start2" << endl;
shared_ptr<SharedPtrClass> b(new SharedPtrClass(true)); //智能指针在函数退出时,计数变0,从而析构指向的对象
cout << "autoDelete shared_ptr end2" << endl;
cout << endl;
}
void circularRef()
{
cout << "circularRef start1" << endl;
shared_ptr<SharedPtrClass> a(new SharedPtrClass(true));
shared_ptr<SharedPtrClass> b(new SharedPtrClass(true));
a->t = b;
b->t = a;//循环引用,不能自动delete,导致内存泄漏,如果去掉这行,两个对象都能delete
cout << "circularRef end1" << endl;
cout << endl;
}
};
四、输出
autoDelete before
autoDelete class start1
SharePrtClass new class
autoDelete class end1
autoDelete shared_ptr start2
SharePrtClass new sharedPtr
autoDelete shared_ptr end2
SharePtrClass free sharedPtr
autoDelete exit
circularRef before
circularRef start1
SharePrtClass new sharedPtr
SharePrtClass new sharedPtr
circularRef end1
circularRef exit