boost 库中不单单这一种智能指针类型。但只有 shared_ptr 是最接近普通指针的一种智能指针,他具有一些非常良好的特性,比如计数器等等,使用 shared_ptr 可以让我们不用花费精力在内存回收上。其他的一些指针与 shared_ptr 的区别如下表:
本文主要介绍 shared_ptr 的一些特性,以后如果你使用到 boost 库,那么用到这个智能指针也会是最多的。 1、boost::shared_ptr****实现了计数引用: 它包装了new操作符在堆上分配的动态对象,但它实现了引用计数,可以自由的拷贝和赋值,在任意地方共享它。当引用计数为0时,它会自动删除被包装的动态分配的对象。 2、boost::shared_ptr不需要手动的调用类似release****方法: 它不像侵入式实现的智能指针一样需要手动的调用类似release方法,全部用由shared_ptr内部的计数器自动增减,这一点是非常有用的。(COM的IUnknow接口以及boost::intrusive_ptr都是基于侵入式设计的智能指针,需要手动调用类似release方法) 3、boost::shared_ptr支持所有权转移: 并且可以安全的存储在stl标准容器中,是在stl容器存储指针的标准解法。例如std::vector<int*> IntVec,使用shared_ptr方式为std::vector<boost::shared_ptr > IntptrVec. 4、boost::shared_ptr的代码操作和注意事项
#include
#include <boost/shared_ptr.hpp>
using namespace std;
class MyClass
{
public:
void func()
{
cout << “MyClass func” << endl;
}
};
class Mem_malloc
{
public:
Mem_malloc()
{
m_int = (int*)malloc(sizeof(int) * 1024 * 1024 * 100); // 400M
}
~Mem_malloc()
{
free(m_int);
}
private:
int* m_int;
};
int main(int argc, char* argv[])
{
// 两种构造
boost::shared_ptr ptr;
boost::shared_ptr ptr_arr(new int(100));
// 与普通指针相差无几
int a = 111;
int* pA = &a;
cout << “*pA = “ << *pA << endl;
cout << “*ptr_arr = “ << *ptr_arr << endl;
// 操作对象
boost::shared_ptr ptr_obj;
boost::shared_ptr ptr_MyClass(new MyClass());
ptr_obj = ptr_MyClass;
ptr_obj->func();
// 智能指针避免普通指针和智能指针混用
// 防止智能指针计数器为0将内存释放后,普通指针就变了野指针。
int* p_int001 = new int(100);
int* p_int002 = p_int001;
//boost::shared_ptr ptr_int003 = p_int002;// 错误的,不能混用
boost::shared_ptr ptr_int004(new int(100));
//int* p_int005 = ptr_int004;// 错误的,不能混用
// 引用计数
boost::shared_ptr ptr_obj001(new MyClass());
cout << ptr_obj001.use_count() << endl;
boost::shared_ptr ptr_obj002 = ptr_obj001;
// 指向同一对象时,两个智能指针的引用计数都会增加
cout << ptr_obj002.use_count() << endl;
cout << ptr_obj001.use_count() << endl;
{
// 新作用域指向同一对象,同样会自增引用计数
boost::shared_ptr ptr_obj003 = ptr_obj001;
cout << “new function” << endl;
cout << “ptr_obj003.use_count() = “ << ptr_obj003.use_count() << endl;
cout << “ptr_obj002.use_count() = “ << ptr_obj002.use_count() << endl;
cout << “ptr_obj001.use_count() = “ << ptr_obj001.use_count() << endl;
}
// 离开作用域后,原作用域内的引用计数会被减去
cout << “exit function” << endl;
cout << “ptr_obj002.use_count() = “ << ptr_obj002.use_count() << endl;
cout << “ptr_obj001.use_count() = “ << ptr_obj001.use_count() << endl;
// 测试智能指针是否会释放内存
{
cout << “准备分配内存” << endl;
// 这个过程打开任务管理器,按下任意键后看内存的变化
system(“pause”);
boost::shared_ptr<Mem_malloc> ptr_obj004(new Mem_malloc());
cout << “准备释放内存” << endl;
// 离开作用域后再看内存的变化
system(“pause”);
// 离开作用域后会自动释放ptr_obj004指向的内存,在任务管理器中,可以明显的看到我们进程内存的变化
}
return 0;
}