C++几种智能指针之间的比较

这些智能指针在设计的时候,一个关键的问题就是所有权的控制。如果把指针所指向的对象比作电视机的话,那么指针就是观众。第一个人需要看电视的时候需要打开它,没人看的时候就要保证把电视关掉。

对于std::auto_ptr,boost::shared_ptr和scoped_ptr,情况如下:

1. std::auto_ptr:auto_ptr这个种族很有趣,每次只让一个人看电视,大家可以换着看,由最后那个不想看的人关掉。当把一个auto_ptr赋值给另一个时,就好比换一个人看电视似的。总之,电视只能一个人看,第二个人想看第一个就得让位。

2. boost::shared_ptr:这个种族就很大方了,有好节目大家一起看:)只要最后一个看电视的人走的时候关掉就好了。看电视的每个人都知道当时有多少人在看,所以最后一个人知道自己的确是最后一个人。

3. boost::scoped_ptr:这是最自私的种族,每个电视只能让一个人看,别人门都没有。所以你不要试图去复制一个scoped_ptr对象。自己的电视自己处理,为了省电自己也得关吧,的确很安全:)

所以,auto_ptr的机理就是复制时转移所有权,也就是所指的对象永远最多为一个auto_ptr对象所有,这样就能保证对象能安全的释放。shared_ptr基于引用计数,当把一个shared_ptr赋给另一个时,引用计数加一,当一个shared_ptr析构时,引用计数减一,当减为零时释放对象。而scoped_ptr不允许复制,所以自始至终对象由唯一的scoped_ptr创建,维护并释放。

时间: 2024-08-06 16:30:39

C++几种智能指针之间的比较的相关文章

四种智能指针:auto_ptr,unique_ptr,shared_ptr,weak_ptr

stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针的使用总结 (1)auto_ptr 主要用于解决资源自动释放的问题.防止用户忘记delete掉new申请的内存空间.使用auto_ptr会在离开变量的作用域之后直接调用析构函数进行资源释放. void Function() { auto_ptr<Obj> ptr(new Obj(20)); ... if (error occur) throw exception... } 但是,这是一种被c++1

C++ 几种智能指针的简单实现

#pragma once // 智能指针 // 定义个类来封装资源的分配和释放,在构造 函数完成资源的分配和初始化,在析构函数完成资源的 // 清理,可以 保证资源的正确初始化和释放. // 这里简单实现 AutoPtr. ScopedPtr.ScopedArray以及 SharedPtr //------------------------------SmartPtr.h------------------- template<typename T> class AutoPtr //缺点 定

3种智能指针

出现智能指针的原因 用智能指针,把申请内存的工作都在接口内部实现并加以限制,把释放内存的工作交给智能指针. 常见的智能指针 1.你知道智能指针吗?智能指针的原理.     2.常用的智能指针.     3.智能指针的实现. 1答案:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针.智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放, 2, 最常用的智能指针: 1)std::auto_ptr,有很多问题. 不支持复制(拷贝构造函数)和赋值(operat

Qt 智能指针学习(7种QT智能指针和4种std智能指针)

从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel *label = new QLabel("Hello Dbzhang800!"); label->show(); return app.exec(); } 在  从 Qt

Qt 智能指针学习(7种QT的特有指针)

从内存泄露开始? 很简单的入门程序,应该比较熟悉吧 ^_^ #include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel *label = new QLabel("Hello Dbzhang800!"); label->show(); return app.exec(); } 在  从 Qt

第十一章:使用智能指针管理对象资源

前言 在前面的文章中,细致地分析了构造函数,拷贝构造函数,赋值运算符,析构函数这几个类中最重要函数的用法. 如果严格地遵循这些做法,可以消除绝大部分资源管理的问题. 然而,要想更灵活的使用对象中的资源,仅仅这些还不够.譬如,若你想自己控制对象资源的生命周期(不要在作用域结束的时候自动被析构掉),那就应当好好考虑下智能指针了. 有人说,智能指针是属于设计模式范畴的产物,这么说有点偏激,但也确实有点道理. 问题分析 我们假定有一个投资类Investment: 1 class Investment 2

More Effective C++ 条款28 Smart Pointers(智能指针)

1. 智能指针(如标准库的auto_ptr,shared_ptr,weak_ptr,boost的scoped_ptr等)主要用于动态内存的管理,同时提供给用户与内置指针一样的使用方法,本条款主要涉及智能指针在构造与析构,复制和赋值,解引等方面的注意点,而非智能指针的实现细节. 2. 智能指针的构造,赋值,析构 智能指针的copy constructor,assignment operator,destructor对应于不同的观念而有不同的实现,主要有三种选择: 1).不允许对象的共享,在调用co

Boost智能指针-基础篇

简介 内存管理一直是 C++ 一个比较繁琐的问题,而智能指针却可以很好的解决这个问题,在初始化时就已经预定了删除,排解了后顾之忧.1998年修订的第一版C++标准只提供了一种智能指针:std::auto_ptr(现以废弃),它基本上就像是个普通的指针:通过地址来访问一个动态分配的对象.std::auto_ptr之所以被看作是智能指针,是因为它会在析构的时候调用delete操作符来自动释放所包含的对象.当然这要求在初始化的时候,传给它一个由new操作符返回的对象的地址.既然std::auto_pt

【C++深入浅出】智能指针之auto_ptr学习

起:  C++98标准加入auto_ptr,即智能指针,C++11加入shared_ptr和weak_ptr两种智能指针,先从auto_ptr的定义学习一下auto_ptr的用法. template<class _Ty> class auto_ptr { // wrap an object pointer to ensure destruction public: //定义_Myt类型,作用域局限于类中,便于书写和理解 typedef auto_ptr<_Ty> _Myt; typ