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

代码如下:

#include <iostream>
#include <malloc.h> /* desc: A smart pointer to automatic alloc and dellocat memories.
author: justinzhang(uestczhangchao@gmail.com).
time: 2015-1-22 09:44:24 */ template <class T>
class smartPtr { public:
smartPtr() {
ptr = NULL;
refCnt = (unsigned *) malloc(sizeof(unsigned));
} smartPtr( T * pt) { this->ptr = pt;
refCnt = (unsigned *) malloc(sizeof(unsigned));
std::cout << "Enter constructor, refCnt is "<< *refCnt << std::endl;
*refCnt = 1; std::cout << "Leave constructor, refCnt is " << *refCnt << std::endl; } smartPtr(smartPtr<T> &copy) { ptr = copy.ptr; refCnt = copy.refCnt;
std::cout << "Enter copy constructor, refCnt is " << *refCnt << std::endl; ++*refCnt; std::cout << "Leave copy constructor, refCnt is "<< *refCnt << std::endl; } smartPtr<T> & operator=(smartPtr<T> &copy) { std::cout << "Enter operator=, refCnt is "<< *copy.refCnt << std::endl; if(this != &copy) {
ptr = copy.ptr;
refCnt = copy.refCnt;
++*refCnt;
}
std::cout << "Leave operator=, refCnt is " << *refCnt << std::endl;
return *this; } ~smartPtr() { std::cout << "Enter destructor, refCnt is " << *refCnt << std::endl; --*refCnt; if(*refCnt == 0 ) {
std::cout << "In destructor, refCnt is 0 , this pointer will be freed." << std::endl; if( NULL != ptr ) { delete ptr;
ptr = NULL; } if(NULL != refCnt ) {
free(refCnt);
refCnt = NULL;
} } else { std::cout << "Leave destructor, refCnt is " << *refCnt << std::endl;
} } T getValue() { return *ptr;
} protected:
T * ptr;
unsigned *refCnt; }; int main() { int * p = new int[2]; smartPtr<int > intSmart(p) ;
smartPtr<int> copySmart(intSmart); // copy constructor will be called.
smartPtr<int> operatorSmart = intSmart ; // Here the copy consturctor will be called, not the assignment operator.
operatorSmart = intSmart; // Here the assignment operator will be called. return 0; }

运行结果如下:

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. 常用API文档

    Python requtets PyQuery Pascal Delphi PHP ThinkPHP5.0完全开发手册 ThinkPHP3.2.3快速入门

  2. CentOS7系统64位下搭建Python3.6环境及相关细节工具部署文章收集

    (1)http://blog.csdn.net/chen798213337/article/details/70767902 问题描述: 安装Navicat管理数据库时,启动界面出现乱码情况. 解决办 ...

  3. 把文件(项目)上传到Git@OSC

    说明: 登录与配置git的操作此处忽略. 假设你已配置好git,并且已绑定oschina. 下面是把一个本地文件夹上传到git的操作: 在git@osc上新建项目.记得选择添加对应的 .gitigno ...

  4. ES6 class 技术点拾遗

    语法 方法不需要加function,方法之间不需要加分号 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() ...

  5. javascript转换时间戳

    var unixTimestamp = new Date(1513814400000);commonTime = unixTimestamp.toLocaleString();

  6. Installing ODIConsole application using weblogic server

    在ODI 创建Java EE Agent时候, 启动Fusion Middleware配置向导创建新域的时候,选择的模板如下,已经包含了 Oracle Data Integrator - Consol ...

  7. Java项目持续集成检查项

    1)   检查项:使用Super POM. 2)   检查项:GroupID应该以特定名称开头.3)   检查项:版本号符合规范.版本号必须是三段数字,之后加或不加-SNAPSHOT.4)   检查项 ...

  8. 〖Linux〗Ubuntu14.04安装32位运行库

    在终端操作: sudo dpkg --add-architecture i386 echo "deb http://old-releases.ubuntu.com/ubuntu/ rarin ...

  9. Knockout学习之表单绑定器(上)

    表单绑定器 “click”绑定 Click 绑定器可以将javascript函数绑定到指定的dom元素,并且再该元素被点击时将触发绑定的函数,大多数情况下都会使用button.input和a元素,当然 ...

  10. django之创建第5个项目-条件语句

    1.index <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...