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的形式提供智能指针的实现,
这个将在后面给读者介绍。。。。。。









版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/72864464

C语言在嵌入式开发中的应用

该课程以STC系列单片机为基础,深入浅出,结合理论和实际操作技巧,讲解C51应用的开发基础及实践经验。通过本课程,读者可以基本掌握基于C51的单片机开发所需要的理论基础和实践经验。尽管是以STC单片机为基础,涉及不同概念的时候,课程仍然会详尽指出标准89c51系列单片机会遇到什么问题。课程建议读者具备一定的语言基础,任何编程语言都可以
  • 2015年01月11日 11:32

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

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

十大愚蠢的错误,以避免与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:10
  • 1533

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

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

C++运算符重载(10) - 智能指针

下面是一个使用普通指针的简单例子:     MyClass *ptr = new MyClass();     ptr->doSomething();     //必须手动释放ptr,避免内存泄漏 ...
  • shltsh
  • shltsh
  • 2015-05-27 00:05:00
  • 838

智能指针最全资料-5篇经典讲义

  • 2011年09月05日 22:36
  • 300KB
  • 下载

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

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

解析智能指针底层简单实现

很多人都误以为智能指针是一个指针,其实不然,智能指针不是指针,智能指针是一个模板,由智能指针实例化出来的的对象具有和常规指针相似的行为,但是他能够自动的释放所指向的对象,所以我们称之为智能指针。如果我...
  • LF_2016
  • LF_2016
  • 2016-09-03 10:58:13
  • 1140

c++智能指针(三)之shared_ptr和new结合使用

shared_ptr和new结合使用我们除了使用make_shared来初始化一个智能指针,还可以使用new返回的指针来初始化智能指针。shared_ptr p1(new int(42));//p1指...
  • u011337574
  • u011337574
  • 2017-12-24 19:54:06
  • 98

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

这一节将从用法上、内存存储上以及生存周期上,对unique_ptr, shared_ptr和weak_ptr做一个深入剖析。unique_ptr   不共享它的指针。它无法复制到其他 unique...
  • u013184159
  • u013184159
  • 2016-04-18 10:57:20
  • 6743
收藏助手
不良信息举报
您举报文章:C ++中的智能指针
举报原因:
原因补充:

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