在C++中,程序员可以直接操作内存,给编程增加了不少的灵活性。但是灵活性是有代价的,程序员必须负责自己负责释放自己申请的内存,否则就会出现内存泄露。智能指针就是为了解决这个问题而存在的。它和其他指针没有本质的区别,主要的目的就是为了避免悬挂指针、内存泄露的问题。在这里,我使用对象的应用计数做了一个smart pointer,当一个对象还有引用的时候,就不执行释放内存的操作,当引用计数为0时,就执行内存释放操作,并且将指针重置为NULL。

代码如下:

  1. #include <iostream>
  2. #include <malloc.h>
  3.  
  4. /*
  5.  
  6. desc: A smart pointer to automatic alloc and dellocat memories.
  7. author: justinzhang(uestczhangchao@gmail.com).
  8. time: 2015-1-22 09:44:24
  9.  
  10. */
  11.  
  12. template <class T>
  13. class smartPtr {
  14.  
  15. public:
  16. smartPtr() {
  17. ptr = NULL;
  18. refCnt = (unsigned *) malloc(sizeof(unsigned));
  19. }
  20.  
  21. smartPtr( T * pt) {
  22.  
  23. this->ptr = pt;
  24. refCnt = (unsigned *) malloc(sizeof(unsigned));
  25. std::cout << "Enter constructor, refCnt is "<< *refCnt << std::endl;
  26. *refCnt = 1;
  27.  
  28. std::cout << "Leave constructor, refCnt is " << *refCnt << std::endl;
  29.  
  30. }
  31.  
  32. smartPtr(smartPtr<T> &copy) {
  33.  
  34. ptr = copy.ptr;
  35.  
  36. refCnt = copy.refCnt;
  37. std::cout << "Enter copy constructor, refCnt is " << *refCnt << std::endl;
  38.  
  39. ++*refCnt;
  40.  
  41. std::cout << "Leave copy constructor, refCnt is "<< *refCnt << std::endl;
  42.  
  43. }
  44.  
  45. smartPtr<T> & operator=(smartPtr<T> &copy) {
  46.  
  47. std::cout << "Enter operator=, refCnt is "<< *copy.refCnt << std::endl;
  48.  
  49. if(this != &copy) {
  50. ptr = copy.ptr;
  51. refCnt = copy.refCnt;
  52. ++*refCnt;
  53. }
  54. std::cout << "Leave operator=, refCnt is " << *refCnt << std::endl;
  55. return *this;
  56.  
  57. }
  58.  
  59. ~smartPtr() {
  60.  
  61. std::cout << "Enter destructor, refCnt is " << *refCnt << std::endl;
  62.  
  63. --*refCnt;
  64.  
  65. if(*refCnt == 0 ) {
  66. std::cout << "In destructor, refCnt is 0 , this pointer will be freed." << std::endl;
  67.  
  68. if( NULL != ptr ) {
  69.  
  70. delete ptr;
  71. ptr = NULL;
  72.  
  73. }
  74.  
  75. if(NULL != refCnt ) {
  76. free(refCnt);
  77. refCnt = NULL;
  78. }
  79.  
  80. } else {
  81.  
  82. std::cout << "Leave destructor, refCnt is " << *refCnt << std::endl;
  83. }
  84.  
  85. }
  86.  
  87. T getValue() {
  88.  
  89. return *ptr;
  90. }
  91.  
  92. protected:
  93. T * ptr;
  94. unsigned *refCnt;
  95.  
  96. };
  97.  
  98. int main() {
  99.  
  100. int * p = new int[2];
  101.  
  102. smartPtr<int > intSmart(p) ;
  103. smartPtr<int> copySmart(intSmart); // copy constructor will be called.
  104. smartPtr<int> operatorSmart = intSmart ; // Here the copy consturctor will be called, not the assignment operator.
  105. operatorSmart = intSmart; // Here the assignment operator will be called.
  106.  
  107. return 0;
  108.  
  109. }

运行结果如下:

C++ smart pointer智能指针的更多相关文章

  1. C++2.0新特性(六)——<Smart Pointer(智能指针)之shared_ptr>

    Smart Pointer(智能指针)指的是一类指针,并不是单一某一个指针,它能知道自己被引用的个数以至于在最后一个引用消失时销毁它指向的对象,本文主要介绍C++2.0提供的新东西 一.Smart P ...

  2. [CareerCup] 13.8 Smart Pointer 智能指针

    13.8 Write a smart pointer class. A smart pointer is a data type, usually implemented with templates ...

  3. Smart pointer 智能指针小总结

    Smart pointer line 58之后smart pointer里的计数已经是0,所以会真正释放它引用的对象,调用被引用对象的析构函数.如果继续用指针访问,会出现如下图的内存访问异常.所以说如 ...

  4. C++2.0新特性(八)——<Smart Pointer(智能指针)之unique_ptr>

    一.概念介绍 unique_ptr它是一种在异常发生时可帮助避免资源泄露的smart pointer,实现了独占式拥有的概念,意味着它可确保一个对象和其他相应资源在同一时间只被一个pointer拥有, ...

  5. C++2.0新特性(七)——<Smart Pointer(智能指针)之weak_ptr>

    一.weak_ptr出现的意义 上一节提到过shared_ptr,它会自动释放“不再需要使用的对象”的相应的资源,但是它不是万能的,在某些时候(比如说循环引用),它会显得力不从心,这就是weak_pt ...

  6. Smart Pointer 智能指针

    P76 参考:http://www.cnblogs.com/lanxuezaipiao/p/4132096.html http://blog.csdn.net/hackbuteer1/article/ ...

  7. C++11特性 - Smart Pointers 智能指针

    已经有成千上万的文章讨论这个问题了,所以我只想说:现在能使用的,带引用计数,并且能自动释放内存的智能指针包括以下几种:         unique_ptr: 如果内存资源的所有权不需要共享,就应当使 ...

  8. 智能指针 shared_ptr 解析

    近期正在进行<Effective C++>的第二遍阅读,书里面多个条款涉及到了shared_ptr智能指针,介绍的太分散,学习起来麻烦.写篇blog整理一下. LinJM   @HQU s ...

  9. c/c++ 标准库 智能指针( smart pointer ) 是啥玩意儿

    标准库 智能指针( smart pointer ) 是啥玩意儿 一,为什么有智能指针??? c++程序员需要自己善后自己动态开辟的内存,一旦忘了释放,内存就泄露. 智能指针可以帮助程序员"自 ...

随机推荐

  1. word2013总是出现未响应卡一下如何解决?

    最近在记笔记,word很烦很烦,总是会卡一下,过一会卡一下.本来以为是自动保存后来发现跟自动保存没有关系. 解决方法:禁用硬件图形加速就好了,不行的话再在硬件加速下面有个"使用子像素定位平滑 ...

  2. String的一些方法试探

    package countio; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; impo ...

  3. SpringBoot集成自定义HandlerMethodArgumentResolver

    传统SpringMVC集成自定义HandlerMethodArgumentResolver的方式为:http://www.cnblogs.com/yangzhilong/p/6282218.html ...

  4. SpringMVC 参数中接收数组、List写法

    本文使用SpringMVC版本: org.springframework:spring-web:4.3.9.RELEASE 写法及说明(示例代码的类上的注解是@RestController,所以不需要 ...

  5. logstash写日志elaticsearch不响应

    在大量的解析日志并写入elasticsearch,在后端节点数据数量及磁盘性能等影响下,es不响应 问题描述: [--12T17::,][WARN ][logstash.outputs.elastic ...

  6. vmware安装找不到虚拟网卡解决方案

    前一段实际,win7升级到win10发现vmware12没有虚拟网卡vnet1/vnet8.这不坑爹吗,没网卡能通信吗? 在网上搜寻一下发现可以重置网络,即可再次安装虚拟网卡...算是对问题的记录学习 ...

  7. Activity四种启动模式之singleTask应用

    Activity启动模式设置:         <activity android:name=".MainActivity" android:launchMode=" ...

  8. 【js+jquery】通用、简单的JS 提示框

    1.该插件不需要依赖 jquery,仅仅使用了原生js 2.简单.通用.可自定义修改样式.支持等待N秒消失.支持消失后跳转其他url , 功能还是比较完善的. 3.不废话,上代码: (我存放的位置在 ...

  9. 【php页面表单提交】form校验后再提交,非ajax提交

    form表单校验后,在执行提交动作: <form method="post" action="{:U('Custom/addmsg')}" id=&quo ...

  10. ios中Pldatabase的用法(4)

    封装成DAO@implementation SqlHelper +(BOOL)InsertSql:(NSString *)sql paramet:(NSMutableDictionary *)parm ...