C++智能指针(整理小结)

来源:互联网 发布:uniprotkb数据库使用 编辑:程序博客网 时间:2024/06/02 04:32

为什么要用智能指针?

先不说真正的原因,且看有多少大牛推荐要用:

《C++ Coding Standards》第13章:Ensure resource are owned by objects. Use explicit RAII and smart pointers。

《C++ Common Knowledge》第40章:RAII;第42章:Smart Pointers。

《Effective C++,3nd Edition》第3章:Resource Management。

这些还不够吗?!

用智能指针有以下好处(参考《Beyond The C++ Standard Library》):

1、可以安全有效的管理各种资源,避免各种资源泄漏;

2、可以减轻程序员的负担,可以更轻松地写出异常安全(exception-safe)的程序。

常用的智能指针:

auto_ptr:

来源:标准库(需要头文件)

特点:

a、不能使用 raw pointer(即指向普通类型的指针)作为右值来调用赋值拷贝函数,而只能使用 raw pointer 作为构造函数的参数;

b、支持拷贝,但资源所有权随之转移;

c、和 const 联用:不能转移所有权。

语义:

析构或者拷贝时自动释放资源(更具体说明请参见《C++ Standard Library》4.2节)。

scoped_ptr:

来源:boost 库

特点:

a、不能使用 raw pointer(即指向普通类型的指针)作为右值来调用赋值拷贝函数,而只能使用 raw pointer 作为构造函数的参数;

b、不支持拷贝;

c、和 const auto_ptr 很像,但可以 reset。

语义:

析构时自动释放资源。

shared_ptr:

来源:boost 库

特点:

a、不支持其他类型的指针(即和本身类型不一样)作为右值来调用赋值拷贝函数;

b、支持拷贝(内部计数会自增);

c、用法:通过 raw pointer 先构造一个 shared_ptr,然后赋给其他需要共享的 shared_ptr 或者 weak_ptr ;

d、可以自己定义清理函数(通过类重载()运算符)从而可以管理内存以外的资源。

语义:

内部保持一个引用计数,多一个共享内部自增1,当共享减至0时释放资源。

intrusive_ptr:

来源:boost 库

特点:

1、功能等同 shared_ptr ;

2、计数接口:intrusive_ptr_add_ref , intrusive_ptr_release 。

语义:

侵入式共享指针,资源的计数及释放由使用者来提供。

weak_ptr:

来源:boost 库

特点:

1、只能从 shared_ptr , weak_ptr 构造;

2、使用 expired 来判断所观察的智能指针是否已释放;

3、使用 lock 来获取资源(这时返回 share_ptr )。

语义:

对资源的一个弱引用,可用就用,不可用即放弃。

同时,boost 库还提供了 scoped_array , shared_array 来对 raw array 进行管理。

工作中经常遇到在一个函数中管理动态内存,程序有多个分支,每个分支都可以退出,这时内存的释放得十分小心,一不小心就会资源泄漏,scoped_ptr 可以很好的解决这个问题。而且,scoped_ptr 可以进一步避免因为程序员没有考虑到而出现的异常造成的资源泄漏(这就是异常安全),因为发生异常堆栈回滚时会调用 scoped_ptr 的析构函数,而且普通的指针没有这个机制。
本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2010/0125/20066.php

原创粉丝点击