【C++系列1】智能指针

前言:
C++没有自动内存回收机制,程序员每次new出来的内存都要手动delete。
智能指针:std::auto_ptr  boost::scoped_ptr  boost::shared_ptr  boost:scoped_array  boost::instrusive_ptr

Totally:
智能指针是一个栈对象 并非指针类型  栈对象生命期结束的收  调用析构函数释放它管理的内存  所有智能指针都重载了“operator->"操作符  返回对象的引用
get()函数式获取裸指针的函数  裸指针是指我们之前认识的指针
reset() 如果不传递参数(或者传递NULL),则智能指针释放当前管理的内存  如果传递一个对象 

1、std::auto_ptr
方便管理单个堆内存对象
申明: std:: auto_ptr <  A >my_A(  new  A ());





我们发现在两条横线之间发生了析构函数  所以赋值构造函数会销毁右值
所以 使用std::auto_ptr的时候 绝对不能使用“operator=”操作符
这个智能指针是要等到生命周期结束才释放内存  即使release了
正确释放:

if (my_memory.get()) {

    Simple* temp_memory = my_memory.release();

    delete temp_memory;

  }

if (my_memory.get()) {

    my_memory.reset();  // 释放 my_memory 内部管理的内存

  }


源码:



总结:
(1)尽量不使用“operator=”
(2)release()函数不会释放对象  仅仅归还所有权
(3)放进vector中  如果=了就会有大问题  crash掉
(4)因为auto_ptr指针限制多  所以印发了boost指针




2、boost::scoped_prt
属于boost库,定义在namespace boost中  管理单个内存堆对象
my_memory.release();            // 编译 error: scoped_ptr 没有 release 函数
my_memory2 = my_memory;         // 编译 error: scoped_ptr 没有重载 operator=,不会导致所有权转移

由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了,如此我们再引入一个智能指针,专门用于处理复制,参数传递的情况

3、boost::shared_prt
boost::shared_ptr 也可以很方便的使用。并且没有 release() 函数。关键的一点,boost::shared_ptr 内部维护了一个引用计数,由此可以支持复制、参数传递等。boost::shared_ptr 提供了一个函数 use_count() ,此函数返回 boost::shared_ptr 内部的引用计数。查看执行结果,我们可以看到在 TestSharedPtr2 函数中,引用计数为 1,传递参数后(此处进行了一次复制),在函数TestSharedPtr 内部,引用计数为2,在 TestSharedPtr 返回后,引用计数又降低为 1。当我们需要使用一个共享对象的时候,boost::shared_ptr 是再好不过的了。


4、boost::scoped_array
boost::scoped_array 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使用。
boost::scoped_array<Simple> my_memory(  new  Simple[2]);  // 使用内存数组来初始化
my_memory[0].PrintSomething();
my_memory.get()[0].info_extend =  "Addition"  ;


5、boost::shared_array
boost::shared_array 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使用。
    由于 boost::scoped_array 独享所有权,显然在很多情况下(参数传递、对象赋值等)不满足需求,由此我们引入 boost::shared_array。跟 boost::shared_ptr 一样,内部使用了引用计数。


6、boost::weak_ptr
my_memory_weak = my_memory;
boost::weak_ptr 是 boost::shared_ptr 的观察者(Observer)对象,观察者意味着 boost::weak_ptr 只对 boost::shared_ptr 进行引用


7、boost::intrusive_ptr


问题:
fatal error C1083: 无法打开包括文件:“boost/shared_ptr.hpp”: No such file or directory

------解决思路----------------------
网上去下载一个放到boost头文件目录下
先从官网(www.boost.org)下载最新版的BOOST源码,

最后:
1、在可以使用 boost 库的场合下,拒绝使用 std::auto_ptr,因为其不仅不符合 C++ 编程思想,而且极容易出错[2]。
2、在确定对象无需共享的情况下,使用 boost::scoped_ptr(当然动态数组使用boost::scoped_array)。
3、在对象需要共享的情况下,使用 boost::shared_ptr(当然动态数组使用boost::shared_array)。
4、在需要访问 boost::shared_ptr 对象,而又不想改变其引用计数的情况下,使用boost::weak_ptr,一般常用于软件框架设计中。
5、最后一点,也是要求最苛刻一点:在你的代码中,不要出现 delete 关键字(或 C 语言的free 函数),因为可以用智能指针去管理。
参考:http://blog.csdn.net/xt_xiaotian/article/details/5714477

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值