智能指针 (一)

2014-11-23 23:11:57 · 作者: · 浏览: 18
智能指针就是存储指向堆上分配的对象的指针,行为上与C++的原生指针基本一致,区别是不需要管理对象的销毁。智能指针可以选择在适当的时机销毁对象,可以大幅降低空悬指针和野指针等错误。所有智能指针如果是非类成员,一般都是栈上分配的对象。这里介绍boost库的智能指针,主要有:
1. scoped_ptr
概念上讲,智能指针意味着持有它所指向对象的拥有权,有责任在该对象不在需要时对其销毁。scoped_ptr只提供了RAII机制,对它指向的对象具有唯一的拥有权,不会被共享和转移。这是通过不可拷贝实现的,所以scoped无法存放到stl容器中。指向的对象在scoped_ptr析构或者reset后会被释放。scoped_ptr实现很简单,基本与原生指针性能差不多。scoped_ptr用在类成员时,可以避免在析构函数中释放指针。
[cpp]
class A {
...
private:
B *obj;
};
class A {
...
private:
B *obj;
}; 类A的析构函数不得不对指针obj进行delete操作,而改成scoped_ptr则可以避免:
[cpp]
class A {
...
private:
boost::scoped_ptr obj;
};
class A {
...
private:
boost::scoped_ptr obj;
};2. shared_ptr
以引用计数的方式共享指针的拥有权。当最后一个shared_ptr被销毁时,指向的对象也会被销毁。由于使用引用计数,无法解决循环引用的问题。shared_ptr实现了拷贝构造函数和赋值运算符,可以存放到stl容器中。同时,也实现了比较运算符,可以存放到关联容器中。
如果T *可以隐式转化(通过static_cast)为U *,那么shared_ptr也可以隐式转化为shared_ptr
线程安全反面,shared_ptr支持:a. 并发读,b. 并发写多个不同的实例,c. 不支持并发读写同一个实例(需加锁)。
下列程序存在循环引用:
[cpp]
#include
#include
#include
using namespace std;
using namespace boost;
class B;
class A {
public:
~A() {
cout << "ref count of B: " << bptr.use_count() << endl;
cout << "deconstruct A" << endl;
}
shared_ptr bptr;
};
class B {
public:
~B() {
cout << "ref count of A: " << aptr.use_count() << endl;
cout << "deconstruct B" << endl;
}
shared_ptr aptr;
};
void test()
{
cout << "begin" << endl;
shared_ptr bptr(new B);
aptr->bptr = bptr;
bptr->aptr = aptr;
cout << "ref count of bptr: " << bptr.use_count() << endl;
cout << "ref count of aptr: " << aptr.use_count() << endl;
cout << "end" << endl;
}
int main(