智能指针浅析(转)

智能指针和普通指针的区别在于智能指针实际上是对普通指针加了一层封装机制,这样的一层封装机制的目的是为了使得智能指针可以方便的管理一个对象的生

命期。智能指针内部有一个计数器,记录了当前内存资源到底有多少指针在引用(可以访问这个资源),当新增加一个可以访问这个资源的引用时,计数器会加

1,反之会减去1,当计数器为0时,智能指针会自动释放他所管理的资源。手动申请,自动释放,方便内存管理,防止内存泄漏。

智能指针的简单实现:

每次创建类的新对象时,初始化指针并将引用计数置为1;

当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;

对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;这是因此左侧的

指针指向了右侧指针所指向的对象,因此右指针所指向的对象的引用计数+1;

调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除对象)。

来源: <http://www.cnblogs.com/yangshaoning/archive/2012/03/18/cpp_smart_pointer.html>

来自为知笔记(Wiz)

时间: 2024-12-15 23:59:42

智能指针浅析(转)的相关文章

Android智能指针浅析

长久以来,C++中的内存管理问题一直让人头疼,空指针,野指针,内存泄露......C++程序员看到这样的问题就是各种头大!这样的问题往往很难解决,尤其是代码架构比较庞大或者复杂的时候.但是同样是面向对象的JAVA语言却没有这个问题,为什么呢?因为java有GC,也就是垃圾回收而C++没有.C++的做法是:程序员必须做到在new一个对象之后当不需要使用它的时候必须delete这个对象.看来很好,没有问题是吧?但是,在实际的项目中,就是会有人忘记去delete这个对象,或者随意delete一个对象,

【C++】 浅析智能指针

引言: 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见. RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 所谓智能指针就是智能/自动化的管

浅析C++中的智能指针

一. 概述 由于最近比较多的接触到这块的代码,因此有必要做个总结. 众所周知,C/C++中的堆内存分配和释放的方式主要是: malloc/free 以及 new/delete 等,但这些方式对程序员要求较高,一不小心很可能就会导致内存泄漏而不自知. 请看下面的代码: void func() { T *pt = new T(); ... /* 此处代码省略若干行 */ delete pt; pt = NULL; return; } 如果 func 函数能顺利执行到 delete 处当然是最理想的.

C++的RAII和智能指针小结

RAII:资源分配即初始化,利用构造函数和析构函数定义一个类来完成对资源的分配和释放 智能指针主要用来防止内存泄漏,我们来举个栗子,看看为什么会有智能指针这个东东 例1: 对于上面这段程序,由于抛出异常的时候影响了代码的执行流,所以要在异常捕获之前将p提前释放(详见 我的博客:C++的异常浅析),虽然可以通过再次抛出以异常解决这个问题,但是在代码美观方面不够完 美,更重要的是如果在代码量非常大,而且在多处有动态开辟出来的空间的时候,仅仅通过再次抛出异常已 经远远不够解决这个问题了,会使得工作量大

浅谈ObjectARX智能指针AcDbObjectPointer的用法

前言 用ARX智能指针打开对象,可以不在乎是否close,但同时也要注意这个变量的作用域(生命周期)问题,ARX智能指针,他的原理是利用类的析构造函数特性自动关闭对象. 这里的智能指针指的是AcDbObjectPointer这一类使用AcDbObjectPointerBase基类派生的类模板统称. 下面是打开示例. void testOpen() { ads_point pt; ads_name ent; if (RTNORM != acedEntSel(NULL,ent,pt)) { retu

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

实战c++中的智能指针unique_ptr系列-- 使用std::unique_ptr代替new operator(错误:‘unique_ptr’ is not a member of ‘std’)

写了很多篇关于vector的博客,其实vector很便捷,也很简单.但是很多易错的问题都是vector中的元素为智能指针所引起的.所以决定开始写一写关于智能指针的故事,尤其是unique_ptr指针的故事. 这是个开始,就让我们使用std::unique_ptr代替new operator吧! 还是用程序说话: #include<iostream> int main() { while (true) int *x = new int; } 看下任务管理器中的内存: 此时使用智能指针unique

C++智能指针简单剖析

导读 最近在补看<C++ Primer Plus>第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑.C++面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shared_ptr的设计原理是什么?如果让你自己设计一个智能指针,你如何完成?等等--.而且在看开源的C++项目时,也能随处看到智能指针的影子.这说明智能指针不仅是面试官爱问的题材,更是非常有实用价值. 下面是我在看智能指针时所做的笔记,希望能够解决你对智能指针的一些困扰. 目录

boost智能指针使用

#include <iostream> #include <tr1/memory> #include <boost/scoped_ptr.hpp> //scoped_ptr还不属于tr1 #include <boost/scoped_array.hpp> //scored_array也不属于tr1 #include <boost/shared_array.hpp> //shared_array也不属于tr1 class CTest { publi