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++中的智能指针...

智能指针就是智能,自动化地管理指针所指向的动态资源的释放,那仫既然已经有了指针的概念那仫为什仫还会有智能指针呢?请看下面一种场景      void fun() { int *ptr=new in...

C++中的智能指针

众所周知,C++中对堆内存的申请与释放完全由用户来控制,这就造成用户在使用的时候经常造成内存泄漏、野指针、重复释放等常见的挂掉问题,所以我们有必要提供一套机制,使得用户只需申请相应的内存,不用管释放的...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

C ++中的智能指针

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

C++中的智能指针

学习了C++primer第四版中的智能指针后趁热写的。。。不知道有没有写错 思路 总的思路就是有2个类。T1,T2, [code] //T1 class cp { private: friend c...

C++中的智能指针

上片博客为大家简单介绍了C++中开辟动态内存的方法,虽然动态内存有好多优点,但是如果我们使用不好的话有时候会给我们的程序带来灾难性的后果,今天这篇博客就为大家介绍一种安全的使用指针的方式智能指针1.智...

C++中的智能指针

C++中的智能指针

C++中的指针(三) 智能指针

原帖及讨论:http://bbs.bccn.net/thread-92844-1-1.html Smart Pointer是C++中的一个大题目,要说清楚他的所有好处很需要费点力气。我就一个功能一个...

c++中智能指针(一)

一、智能指针的引入: 智能指针为什么要引入呢?看下边的代码: void fun() { int *p = new int(2); if(1) ...

c++中智能指针(二)

一、shared_ptr的循环引用问题 在上篇文章中介绍了智能指针的基本知识,我们感觉shared_ptr好像特别厉害的样子,其 实它就是特别厉害,只是它有循环引用的问题,看下边的代码: str...

C++中智能指针auto_ptr

1. 智能指针auto_ptr的引入 auto_ptr是C++标准库中的智能指针模板类,头文件 auto_ptr的出现,主要是为了解决“有异常抛出时发生内存泄漏”的问题。如下的简单代码是这...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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