Boost中文手册下载:http://download.csdn.net/detail/skdkjxy/8723045
用法:
1 与share_ptr功能上是一样的,只不过引用计数是采用侵入式实现的,尽量避免使用,除非:
已有代码使用或提供了插入式的引用计数
智能指针的大小必须与裸指针的大小相等
需要把 this 当作智能指针来使用时(this是智能指针的this)
2 需要你提供两个函数 intrusive_ptr_add_ref 和intrusive_ptr_release. 它们都要接受一个参数,即指向你要使用intrusive_ptr的类型的指针,
intrusive_ptr内部会调用两个函数
实现这两个泛型函数的示范,但不是最终版本:
template <typename T> void intrusive_ptr_add_ref(T* t) { t->add_ref(); } template <typename T> void intrusive_ptr_release(T* t) { if (t->release()<=0) delete t; }
3 把上面两个函数放在定义在它们操作的类型所在的名字空间里(T类型),同时增加有一些直接操作基类的函数,这样做的优点在于,即使从reference_counter派生的类定义在其它的名字空间,intrusive_ptr_add_ref 和intrusive_ptr_release 也还可以通过ADL (参数相关查找法)找到它们;ADL是一个查找规则,例如,调用一个函数,该函数在当前作用域空间中找不到,那么会到函数参数所在的命名空间中寻找;
下面是实现的一个例子:
class reference_counter {
int ref_count_;
public:
reference_counter() : ref_count_(0) {}
virtual ~reference_counter() {}
friend void intrusive_ptr_add_ref(reference_counter* p) {
++p->ref_count_;
}
friend void intrusive_ptr_release(reference_counter* p) {
if (--p->ref_count_==0)
delete p;
}
void add_ref() {
++ref_count_;
}
int release() {
return --ref_count_;
}
protected:
reference_counter& operator=(const reference_counter&) {
// 无操作
return *this;
}
private:
// 禁止复制构造函数
reference_counter(const reference_counter&);
};
class another_class : public reference_counter {
public:
void call_before_destruction() const {
std::cout <<
"Yes, I'm ready before destruction\n";
}
};
class derived_class : public another_class {};
template <typename T> void intrusive_ptr_add_ref(T* t) {
t->add_ref();
}
template <typename T> void intrusive_ptr_release(T* t) {
if (t->release()<=0) {
delete t;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
boost::intrusive_ptr< derived_class > share3(new derived_class());
getchar();
return 0;
}
综上,intrusive_ptr使用更加复杂,也意味着容易出错;由于旧的代码,或者是为了与第三方的类进行集成,不得不用;否则不用;程序设计的越简单越好;