前言:
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头文件目录下
------解决思路----------------------
网上去下载一个放到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