C ++中的智能指针

原创 2017年06月05日 10:12:39

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

考虑以下简单的C ++代码与正常的指针。

  MyClass *ptr = new MyClass();
  ptr->doSomething();
  //  We must do delete(ptr) to avoid memory leak

   智能指针在游戏开发中经常使用,使用智能指针,我们可以使指针以我们不需要显式调用delete的方式工作。 智能指针是一个包含类的操作符,如*和 - >重载的指针。 智能指针类的对象看起来像指针,但可以做许多事情,一个普通的指针不能自动破坏(是的,我们不必明确地使用delete),引用计数等等。
这个想法是使用一个指针,析构函数和重载运算符(如*和 - >)来创建一个类。 由于当对象超出范围时自动调用析构函数,所以动态分配的内存将自动删除(或引用计数可以递减),考虑以下简单的smartPtr类。

#include<iostream>
using namespace std;
 
class SmartPtr
{
   int *ptr;  // Actual pointer
public:
   // Constructor: Refer http://www.geeksforgeeks.org/g-fact-93/
   // for use of explicit keyword 
   explicit SmartPtr(int *p = NULL) { ptr = p; } 
 
   // Destructor
   ~SmartPtr() { delete(ptr); }  
 
   // Overloading dereferencing operator
   int &operator *() {  return *ptr; }
};
 
int main()
{
    SmartPtr ptr(new int());
    *ptr = 20;
    cout << *ptr;
 
    // We don't need to call delete ptr: when the object 
    // ptr goes out of scope, destructor for it is automatically
    // called and destructor does delete ptr.
 
    return 0;
}

Output:

20

我们可以编写一个适用于所有类型的智能指针类吗?

是的,我们可以使用模板来编写一个通用的智能指针类 以下C ++代码演示一样。

#include<iostream>
using namespace std;
 
// A generic smart pointer class
template <class T>
class SmartPtr
{
   T *ptr;  // Actual pointer
public:
   // Constructor
   explicit SmartPtr(T *p = NULL) { ptr = p; }
 
   // Destructor
   ~SmartPtr() { delete(ptr); }
 
   // Overloading dereferncing operator
   T & operator * () {  return *ptr; }
 
   // Overloding arrow operator so that members of T can be accessed
   // like a pointer (useful if T represents a class or struct or 
   // union type)
   T * operator -> () { return ptr; }
};
 
int main()
{
    SmartPtr<int> ptr(new int());
    *ptr = 20;
    cout << *ptr;
    return 0;
}

Output:

20
智能指针在管理资源(如文件句柄或网络套接字)中也很有用。
C ++库以auto_ptr,unique_ptr,shared_ptr和weak_ptr的形式提供智能指针的实现,
这个将在后面给读者介绍。。。。。。









版权声明:本文为博主原创文章,未经博主允许不得转载。

C/C++知识要点5——智能指针原理及自定义实现

智能指针概述: 智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。 C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr 区别是...
  • TommyZht
  • TommyZht
  • 2015年08月10日 10:51
  • 1501

十大愚蠢的错误,以避免与C ++ 11智能指针

Top 10 dumb mistakes to avoid with C++ 11 smart pointers I love the new C++ 11 smart pointers. In...
  • sergeycao
  • sergeycao
  • 2016年09月14日 15:22
  • 1413

c++11智能指针解析——揭开底层面纱,完整理解智能指针

昨天跟同事小小的研究了下关于不同平台下,起因是遇到了一个坑,vs上没有问题,在安卓上却崩溃了。找了半天后发现是c++字节补齐问题,期间包括使用#pragma pack(1)来限定字节对齐方式等各种条件...
  • zy19940906
  • zy19940906
  • 2016年01月07日 17:00
  • 11144

自己实现简单的智能指针

#include #include using namespace std; template class share { public: share():point(0){} share(T...
  • chenycbbc0101
  • chenycbbc0101
  • 2016年08月04日 19:40
  • 1191

C++11新特性之智能指针

这一节将从用法上、内存存储上以及生存周期上,对unique_ptr, shared_ptr和weak_ptr做一个深入剖析。unique_ptr   不共享它的指针。它无法复制到其他 unique...
  • u013184159
  • u013184159
  • 2016年04月18日 10:57
  • 6549

C++面试题(四)——智能指针的原理和实现

普通C++面试时候的一般都是这个套路:      1,C++和C相比最大的特点——面向对象:封装,继承,多态。      2,你知道虚函数吗?——实现多态所必须,父类类型的指针指向子类的实例,执行的时...
  • worldwindjp
  • worldwindjp
  • 2014年01月28日 17:00
  • 11979

浅谈BOOST库里面的智能指针

大家都知道,学习C语言,指针很很重要的一部分,那么为什么在C11中还会出现智能指针的概念呢,我们都知道C11是将以前C99的知识进行了更加深入的改变,让C用起来更加的方便,而且它还创建了许多新的类型,...
  • km_1314107
  • km_1314107
  • 2017年07月19日 10:31
  • 364

智能指针探索(一)——成员变量的释放

#include #include #include #include using namespace std;class Engine { public: Engine() { n...
  • Sephiroth_Ace
  • Sephiroth_Ace
  • 2017年06月11日 16:11
  • 282

[C/C++] 智能指针的实现及原理

#include #include #include #include #include #include #include #include #include #include ...
  • robby_chan
  • robby_chan
  • 2013年02月17日 22:14
  • 623

c++学习笔记—动态内存与智能指针浅析

我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁。 栈内存用来保存定义在函数内部的非st...
  • xujian_2014
  • xujian_2014
  • 2015年01月08日 15:45
  • 761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C ++中的智能指针
举报原因:
原因补充:

(最多只允许输入30个字)