shared_ptr
常用接口
use_count() : 获得引用计数数量。
get() : 获得原始指针。
reset() : 指向NULL内存。
注意事项
1. 不能直接赋值NULL,编译无法通过;如果需要清空使用reset();reset后,ptr指向NULL内存。
2. 不能手动释放内存,如delete ptr.get(),这将会出现内存错误,至于为什么,目前还不清楚。
3. 先分配内存,再交给智能指针,再释放也不可以,如
int * c = new int;
boost::shared_ptr<int> pObj(c);
delete c;
会出现内存错误,boost是怎么防止用户在外面delete c的呢?
weak_ptr
是执行弱引用的智能指针。当你需要它的时候就可以使用一个强(共享)指针指向它(当对象被释放的时候,它为空),当然这个强指针在使用完毕应该立即释放掉
struct CBetterChild : public CSample
{
weak_ptr<CDad> myDad;
void BringBeer()
{
shared_ptr<CDad> strongDad = myDad.lock(); // request a strong pointer
if (strongDad) // is the object still alive?
strongDad->SetBeer();
// strongDad is released when it goes out of scope.
// the object retains the weak pointer
}
};
注意事项
1. 弱引用如果需要操作类对象,需要转为强引用,通过lock接口获得
2. 获得强引用后,需要检测对象是否为空,因为有可能对象已经释放
3. 操作完毕后,强引用应该马上释放,也就是强引用最好是临时局部变量
常用接口
lock() : 转为强引用,如果对象已经释放,则返回空的强引用
expired(): 判断对象是否已经释放