原标题:C ++中的智能指针

考虑以下带有普通指针的简单C ++代码。

MyClass *ptr = new MyClass();

ptr->doSomething();

// We must do delete(ptr) to avoid memory leak

使用智能指针,我们可以指示工作方式,我们不需要显式调用delete。智能指针是指针上的包装类,运算符如*和 - >重载。 智能指针类的对象看起来像指针,但可以执行许多事情,正常的指针不能像自动销毁(是的,我们不必显式使用删除),引用计数等等。

我们的想法是创建一个带有指针,析构函数和重载运算符(如*和 - >)的类。由于当对象超出范围时会自动调用析构函数,因此动态分配的内存将自动删除(或者引用计数可以递减)。考虑以下简单的smartPtr类。

#include

using namespace std;

class SmartPtr

{

int *ptr; // Actual pointer

public:

// Constructor: Refer https://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;

}

输出:

20

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

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

#include

using namespace std;

// A generic smart pointer class

template

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 ptr(new int());

*ptr = 20;

cout << *ptr;

return 0;

}

输出:

20

智能指针在管理资源时也很有用,例如文件句柄或网络套接字。

C ++库以auto_ptr,unique_ptr,shared_ptr和weak_ptr的形式提供智能指针的实现返回搜狐,查看更多

责任编辑:

c语言智能指针是什么,C ++中的智能指针相关推荐

  1. c语言设置bufsiz大小,c语言缓冲区有关问题及c++中的this指针

    c语言缓冲区问题及c++中的this指针 1.怎么改变c中缓冲区的大小,使用setbuf[stout,buf];改变buf的大小并不能改变缓冲区的大小,而函数 说明中要求把buf大小设置成BUFSIZ ...

  2. 【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

    文章目录 一.结构体中嵌套二级指针 1.结构体中嵌套二级指针 类型声明 2.为 结构体内的二级指针成员 分配内存 3.释放 结构体内的二级指针成员 内存 二.完整代码示例 一.结构体中嵌套二级指针 1 ...

  3. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  4. c6011取消对null指针的引用_C++中的野指针及其规避方法

    今天在调试程序过程中,用到了一些指针的方法,这里记录一下野指针的概念. 1.概念 野指针,也就是指向不可用内存区域的指针.通常对这种指针进行操作的话,将会使程序发生不可预知的错误. 野指针与空指针(N ...

  5. c# 中代替指针的功能_C中的功能指针

    c# 中代替指针的功能 A function pointer in C is a pointer that points to a function. C语言中的函数指针是指向函数的指针 . The ...

  6. git 移动分支指针_理解git 中的HEAD指针branch指针

    HEAD指针 使用git checkout 来移动HEAD指针,移动的对象可以是分支指针也可以是快照. HEAD指针可以指向快照也可以指向branch.当指向branch时提交后会和branch指针一 ...

  7. html自定义指针,如何自定义鼠标指针 怎样在wpf中自定义鼠标指针

    如何在ppt中自定义鼠标指针的形状? 魔兽世界怎么自定义鼠标指针 在系统 控制面板 里面鼠标属性 指针里面改就可以了 下面有个浏览 可以自定义换图案 怎样在网页中设定一整套自定义的鼠标指针? 麻烦了 ...

  8. c++中引用及指针详解

    这里写目录标题 1.指针 1.1.什么是指针 指针的本质 指针与地址 程序中如何声明指针以及如何使用运算符&和* 1.2.指针有什么作用 指针与函数参数 2.引用 2.1.什么是引用 2.2. ...

  9. 基于机器视觉的煤中杂物智能分选系统研究

    基于机器视觉的煤中杂物智能分选系统研究 王卫东,张康辉 新机器视觉 昨天 新机器视觉 最前沿的机器视觉与计算机视觉技术 206篇原创内容 公众号 原煤在开采过程中经常会混入各类铁器.锚杆.锚索.网片. ...

最新文章

  1. 使用HttpOnly提升Cookie安全性
  2. linux内存cached手动释放
  3. python自动测试p-使用python+requests实现接口自动化测试
  4. Windows server 2008 远程桌面建立
  5. 解读main()方法中的String[] args
  6. 程序、进程以及线程的爱恨情仇
  7. 搜狗浏览器收藏夹在哪_是时候换个快速安全的浏览器了,这一次它一定不负众望...
  8. 动物克隆技术应用价值_虽然有了克隆技术为什么要进行克隆呢
  9. python数据类型和循环控制
  10. 【Python笔记】使用 re 模块实现正则表达式操作
  11. Linux 吉祥物30岁了!“出道”30年,你对Linux了解多少?
  12. 海康摄像头近距离不能对焦模糊问题
  13. zutuanxue.com-DNS服务器
  14. epub电子书--目录结构介绍
  15. 小米8装magisk
  16. 网络安全系列-三十四: EDR、NDR、XDR 、HIPS、NIPS、NTA、DPI、DFI、南北流量、东西流量:傻傻分不清楚
  17. 设计模式(21)备忘录模式
  18. Eversipn STT-MRAM的MJT细胞
  19. ubuntu 定时重启/关闭进程
  20. 机器学习 之 Kmeans聚类

热门文章

  1. 一首考研人不得不看的立志诗!!!!!!
  2. 失败的Omni协议与继续前行的虫洞协议
  3. API网关与zuul1.x与springcloud的三角关系
  4. 23种设计模式之单例模式
  5. 对FCKEditor = 2.6.4 通杀 exploit 的分析
  6. 【css】垂直居中的几种写法
  7. checkbox管理
  8. mysql+redis
  9. Unity3D中暂停时的动画及粒子效果实现
  10. python glances来监控linux服务器CPU 内存 IO使用