博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++智能指针(一)智能指针的简单介绍
阅读量:4096 次
发布时间:2019-05-25

本文共 1268 字,大约阅读时间需要 4 分钟。

https://blog.csdn.net/nou_camp/article/details/70176949

C++智能指针 

在正式了解智能指针前先看一下下面的一段代码

#include
using namespace std;class A{public: A() :_ptr(NULL), _a(0) {} ~A() {}public: int* _ptr; int _a;};void test(){ A a; int *p1 = new int(2);}int main(){ test(); system("pause"); return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这个代码仅从编译运行是的角度是没有问题的,但是细心看很明显这段代码是不负责任的,因为它存在内存泄漏。只是释放了_ptr,但是p1压根没释放。在这里看起来内存泄漏没有对结果造成什么,但是千万不要小瞧内存泄漏,这是个很严重的问题。如果一个特别大的项目中存在很多很多的内存泄漏问题,一开始可能没有什么问题,但是过一段时间服务器可能会挂掉,这就是内存泄漏导致内存不够用产生的。 

为了解决这些问题,可以采用下面这种方法。

#include
using namespace std;void fun(){ throw 2;}int main(){ try{ fun(); } catch (int e) { cout << e << endl; } system("pause"); return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

异常对象在传给对应的catch处理后撤销。这样做是可以的,但是如果代码中有比较多的异常,这样显然不合适,大量的try catch会影响代码逻辑,导致代码丑陋不堪。为了解决这个问题,引入了智能指针。 

说到智能指针,必须知道RAII 
RAII:资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。智能指针只是RAII的一种应用。 
智能指针:所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。 
智能指针的发展可分为三个部分, 
1.auto_ptr 管理权的转移–带有缺陷的设计–c++98/03 
2.scoped_ptr(boost) unique_ptr(c++11) 防拷贝 –简单粗暴的设计 –功能不全 
3.shared_ptr(boost/c++11) 引用计数 –功能强大(支持拷贝,支持定制删除器) 缺陷–循环引用(可采用weak_ptr配合解决)

你可能感兴趣的文章
zookeeper(2)---shell操作
查看>>
mapReduce(3)---入门示例WordCount
查看>>
hbase(3)---shell操作
查看>>
hbase(1)---概述
查看>>
hbase(5)---API示例
查看>>
SSM-CRUD(1)---环境搭建
查看>>
SSM-CRUD(2)---查询
查看>>
SSM-CRUD (3)---查询功能改造
查看>>
Nginx(2)---安装与启动
查看>>
springBoot(5)---整合servlet、Filter、Listener
查看>>
C++ 模板类型参数
查看>>
C++ 非类型模版参数
查看>>
设计模式 依赖倒转原则 & 里氏代换原则
查看>>
DirectX11 光照
查看>>
图形学 图形渲染管线
查看>>
DirectX11 计时和动画
查看>>
DirectX11 光照与材质的相互作用
查看>>
DirectX11 法线向量
查看>>
DirectX11 兰伯特余弦定理(Lambert)
查看>>
DirectX11 漫反射光
查看>>