关于智能指针

posdjsfj 2005-12-24 04:12:19
请介绍一下智能指针,还有是BOOST那个好还是ANSI的auto_ptr好
...全文
865 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenmea00000 2005-12-25
  • 打赏
  • 举报
回复
学习中~~~~~~~~~~~~
XPR 2005-12-25
  • 打赏
  • 举报
回复
学习,学习,有些没明白!
fiftymetre 2005-12-24
  • 打赏
  • 举报
回复
使用BOOST前还得先考虑一下编译器支不支持的问题
pripor 2005-12-24
  • 打赏
  • 举报
回复
看看more effective,里面讲的很清楚
睡在床板下_ 2005-12-24
  • 打赏
  • 举报
回复
头文件 memory 中有auto_ptr的具体实现,好好看看,会明白些
doway 2005-12-24
  • 打赏
  • 举报
回复
支持楼上。
whyglinux 2005-12-24
  • 打赏
  • 举报
回复
对于智能指针,不存在哪个好哪个不好的问题,只存在选用哪个更合适的问题。
zhousqy 2005-12-24
  • 打赏
  • 举报
回复
auto_ptr的拷贝构造函数会使原来的智能指针失效
void foo(auto_ptr<int> p)
{
}
...
auto_ptr<int> ap = new int;
//此时ap.get() != 0
foo(ap);
//此时ap.get() == 0
province_ 2005-12-24
  • 打赏
  • 举报
回复
学习新知识不亦乐乎
sankt 2005-12-24
  • 打赏
  • 举报
回复
许多数据重要的结构以及应用,象链表,STL容器,串,数据库系统以及交互式应用必须使用动态内存分配,因此仍然冒着万一发生异常导致内存溢出的风险。C++标准化委员会意识到了这个漏洞并在标准库中添加了一个特殊的类模板,它就是std::auto_ptr,其目的是促使动态内存和异常之前进行平滑的交互。Auto_ptr保证当异常掷出时分配的对象(即:new操作符分配的对象)能被自动销毁,内存能被自动释放。下面我们就来讨论使用动态内存时,如何正确和有效地使用auto_ptr来避免资源溢出。这个技术适用于文件,线程,锁定以及与此类似的资源。

Auto_ptr的定义可以在<memory.h>中找到。与标准库中其它的成员一样,它被声明在命名空间std::中。当你实例化auto_ptr对象时,对它进行初始化的方法是用一个指针指向动态分配的对象,下面是实例化和初始化auto_ptr对象的例子:
include <memory>
#include <string>
using namespace std;
void func()
{
auto_ptr<string> pstr (new string); /* 创建并初始化auto_ptr */
}

auto_ptr后面的尖括弧里指定auto_ptr指针的类型,在这个例子中是string。然后auto_ptr句柄的名字,在这个例子中是pstr。最后是用动态分配的对象指针初始化这个实例。注意你只能使用auto_ptr构造器的拷贝,也就是说,下面的代码是非法的:
auto_ptr<string> pstr = new string; //编译出错

Auto_ptr是一个模板,因此它是完全通用的。它可以指向任何类型的对象,包括基本的数据类型:
auto_ptr<int> pi (new int);

一旦你实例化一个auto_ptr,并用动态分配的对象地址对它进行了初始化,就可以将它当作普通的对象指针使用,例如:
*pstr = "hello world"; //赋值
pstr->size(); //调用成员函数

之所以能这样做是因为auto_ptr重载了操作符&,*和->。不要被语法误导,记住pstr是一个对象,不是一个指针。

auto_ptr是如何解决前面提到的内存溢出问题呢?auto_ptr的析构函数自动摧毁它绑定的动态分配对象。换句话说,当pstr的析构函数执行时,它删除构造pstr期间创建的串指针。你绝不能删除auto_ptr,因为它是一个本地对象,它的析构函数是被自动调用的。让我们看一下函数func()的修订版本,这次使用了auto_ptr:
void func()
{
auto_ptr<string> pstr (new string);
g(); //如果g()掷出异常,pstr 被自动摧毁
}

C++保证在堆栈展开过程中,自动存储类型的对象被自动摧毁。因此,如果g()掷出异常,pstr的析构函数将会在控制被转移到catch(...)块之前执行。因为pstr的析构函数删除其绑定的串指针,所以不会有内存溢出发生。这样我们在使用动态分配对象时,利用auto_ptr就实现了自动和安全的本地对象。

如何避免使用auto_ptr的缺陷

auto_ptr并不是完美无缺的,它的确很方便,但也有缺陷,在使用时要注意避免。首先,不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做,否则可能会碰到不可预见的结果(在另文中讨论)。

auto_ptr的另一个缺陷是将数组作为auto_ptr的参数:
auto_ptr<char> pstr (new char[12] ); //数组;为定义

记住不管什么时候使用数组的new操作时,必须要用delete[]来摧毁数组。因为auto_ptr的析构函数只对非数组类型起作用。所以数组是不能被正确摧毁的话,程序的行为是不明确的。总之,auto_ptr控制一个由new分配的单对象指针,仅此而已。
我啃 2005-12-24
  • 打赏
  • 举报
回复
全吧
我啃 2005-12-24
  • 打赏
  • 举报
回复
关于比较嘛:
http://www.flyingdonkey.com/articles/Boost_vs_Loki.pdf
还有BOOST里的用法
http://www.stlchina.org/twiki/bin/view.pl/Main/BoostProgrammSmartPoint
我啃 2005-12-24
  • 打赏
  • 举报
回复
2001 年10 月和2002 年4 月,在美国的华盛顿和荷兰的安的列斯群岛上分别召开了两次C++标准会议。会
议的内容之一是对一项新的C++特性提议——智能指针(Smart Pointer)——进行讨论。本文将对可能成为C
++新标准的两种智能指针方案(Boost vs. Loki)进行介绍和分析,并给出了相应的使用实例。
关键词:智能指针 C++ Boost Loki
在现在的标准C++中,只有一种智能指针:std::auto_ptr。其原因并非是因为auto_ptr 已足以应付所
有相关的工作——实际上,auto_ptr 有一个重大的缺陷,就是它不能被用在STL 容器中——而是因为现在的C+
标准在制定时并未能对智能指针进行全面的考察。按照C++标准委员会成员Herb Sutter 的说法,只有一种标
准的智能指针是一件“可羞”的事情:首先,智能指针所能做的许多有用的事情,是可怜的auto_ptr 不能完成
的;其次,在有些情况下使用auto_ptr 可能会造成问题,上面所说的不能在容器中使用就是一例。实际上,许
多程序员已经开发了各种有用的智能指针,有些甚至在auto_ptr 被定为标准之前就已存在,但问题是,它们不
是标准的。在这样的情况下,C++标准委员会考虑引入新的智能指针,也就是自然而然的事情了。目前进入委员会
视野的,主要有两种智能指针方案:Boost 智能指针和Loki 智能指针。前者是由C++标准委员会库工作组发起的
Boost 组织开发的,而后者由世界级的C++专家Andrei Alexandrescu 开发,并在他所著的“Modern C++
Design”一书中进行了详细的阐释。下面,让我们分别来看一看这两种方案各自的技术特点。

一、 Boost 智能指针
Boost 的智能指针方案实现了五种智能指针模板类,每种智能指针都用于不同的目的。这五种智能指针是:
template<typename T> class scoped_ptr;
template<typename T> class scoped_array;
template<typename T> class shared_ptr;
template<typename T> class shared_array;
template<typename T> class weak_ptr;
下面将分别介绍它们各自的特性,并给出相应的使用实例:
􀁺 scoped_ptr:意在用作指向自动(栈)对象的、不可复制的智能指针。该模板类存储的是指向动态分配的
对象(通过new 分配)的指针。被指向的对象保证会被删除,或是在scoped_ptr 析构时,或是通过显式地调用
reset 方法。注意该模板没有“共享所有权”或是“所有权转让”语义。同时,它也是不可复制的(noncopyab
le)。正因为如此,在用于不应被复制的指针时,它比shared_ptr 或std:auto_ptr 要更安全。与auto_ptr
一样,scoped_ptr 也不能用于STL 容器中;要满足这样的需求,应该使用shared_ptr。另外,它也不能用于
存储指向动态分配的数组的指针,这样的情况应使用scoped_array。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧