解决内存泄漏问题,智能指针可以自动删除分配的内存。
C11,提供三种智能指针:shared_ptr,unique_ptr,weak_ptr
引用
1.shared_ptr,共享的智能指针
使用引用计数,每一个shared_ptr都指向相同的内存,最后一个shared_ptr析构的时候,内存才被释放。
初始化:
1)shared_ptr
2)shared_ptr
ptr.reset(new int(5));
3) shared_ptr
shared_ptr
4)使用make_shared初始化
错误的写法:
shared_ptr
获取原始指针
int* p2 = p.get();
指定删除器
1.调用函数、lambda表达式、default_delete
如下:
1)void delPtr(int* p)
{
delete p;
cout << "del suc" << endl;
}
shared_ptr
2)shared_ptr
shared_ptr
3)shared_ptr
注意事项:
1)不要用一个原始指针初始化多个shared_ptr
2)不要在函数参数中创建shared_ptr
3)通过shared_from_this()返回this指针。不要将this指针作为shared_ptr返回出来,因为this指针本质上是一个裸指针,因此,会导致重复析构。
如下,是错误的:
struct A
{
A()
{
cout << "A,construct" << endl;
}
shared_ptr Getself()
{
cout << "getself" << endl;
return shared_ptr (this);
}
~A()
{
cout << "~~A,discontruct" << endl;
}
};
shared_ptr sp1(new A);
shared_ptr sp2 = sp1->Getself();
正确的写法:
class A :public enable_shared_from_this
{
public:
shared_ptr Getself()
{
return shared_from_this();
}
A()
{
cout << "A,construct" << endl;
}
~A()
{
cout << "~~A,discontruct" << endl;
}
};
4)避免循环引用
如下,是错误的:
struct A;
struct B;
struct A
{
shared_ptr bptr;
~A()
{
cout << "A is delete" << endl;
}
};
struct B
{
shared_ptr aptr;
~B()
{
cout << "B is delete" << endl;
}
};
{
shared_ptr ap(new A);
shared_ptr bp(new B);
ap->bptr = bp;
bp->aptr = ap;
}
改为如下,是正确的:
struct A;
struct B;
struct A
{
shared_ptr bptr;
~A()
{
cout << "A is delete" << endl;
}
};
struct B
{
weak_ptr aptr;
~B()
{
cout << "B is delete" << endl;
}
};
unique_ptr,见下篇
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)