当前位置:首页 > c++ > 正文内容

C++智能指针基本原理

xuwenyan2年前 (2021-03-01)c++90

什么是智能指针?

最简单来说就是会自动释放内存的指针,使用方便,不用担心内存泄漏问题。它其实就是通过封装,利用对象的析构函数释放申请的内存,基本上自动释放的用法都是利用析构函数去做一些释放工作。如:自动释放的句柄

智能指针的基本实现

class TestClass {
 public:
   TestClass() {
     MessageBoxA(0, "构造", 0, 0);
   }
 ~TestClass() {
     MessageBoxA(0, "析构", 0, 0);
   }
 };
class AutoPtr {
 public:
   AutoPtr(TestClass* ptr): ptr_(ptr){ }
   ~AutoPtr() {
     if (ptr_ != nullptr) {
       delete ptr_;
     }
   }
 private:
   TestClass*    ptr_;
 };
 int main() {
   AutoPtr obj(new TestClass);
   return 0;
 }

上面的例子中,AutoPtr就是一个最为简单的智能指针,当然要使用它所封装的对象还需要重载一些必要的运算符,这里讨论的是智能指针基本原理就不过多讲述了。TestClass这个类的对象在main函数只被new而并未被delete,但当main函数结束时,AutoPtr的析构函数会被自动调用,而AutoPtr的析构函数中delete了我们申请的对象,这就是智能指针从开始到结束的一个基本过程。这就是上面所说的,利用了AutoPtr的析构函数去释放内存,当然这只是智能指针最最基本的东西。

上面的AutoPtr只支持传入TestClass对象,要让AutoPtr支持任意的类,我们需要使用模板对AutoPtr稍微封装一下,如下:

template <typename T>
class AutoPtr {
 public:
   AutoPtr(T* ptr): ptr_(ptr){ }
   ~AutoPtr() {
     if (ptr_ != nullptr) {
       delete ptr_;
     }
   }
 private:
   T*    ptr_;
 };
int main() {
  AutoPtr<TestClass> obj(new TestClass);
  return 0;
}
    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/354

    分享给朋友:

    “C++智能指针基本原理” 的相关文章

    Visual Studio编译7z源代码

    Visual Studio编译7z源代码

    源代码下载打开地址https://www.7-zip.org/download.html,选择源码下载,可以选择自己需要的版本下载7z.dll编译1:解压源代码包,打开vs解决方案,CPP7zipBundlesFormat7zFFormat7z.dsw,vs会提示升级,不用管,选择升级。2:修改7z...

    C++实现win32窗口文件拖拽

    C++实现win32窗口文件拖拽

    如题,C++如何实现win32窗口文件拖拽,直接上代码 方法1:使用win32消息实现 此方法的弊端在于,无法过滤可以拖拽的文件,拖拽时显示的图标也默认的,无法像资源管理器那样自定义。实现步骤大致分为以下三步: 第一步:首先创建窗口时必须在exStyle加上WS_EX_ACCEP...

    C++如何获取控制台程序的输出内容?

    C++如何获取控制台程序的输出内容?

    很多工具程序(如ffmpeg)的进度显示往往都是以控制台字符显示的方法,我们可能需要调用这种控制台工具去完成工作,但同时又希望以友好的ui界面去显示当前的工作状态(如进度)。此时我们能想到的就是运行控制台程序,然后以某种方式去获取到控制台程序的输出,然后转换到我们的ui界面上去显示。 有多种...

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    学习ffmpeg时遇到一个问题,ffmpeg解码出RGB颜色后怎么绘制到屏幕上,于是将GDI、MFC_GDI、GDI+等方式都记录一下 1:注意按windows的要求,R、G、B、A顺序要调整为B、G、R、A 。 2:GDI不支持透明通道A,透明通道A的值读进去以后没有作用。想要支持透...

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    例如,我用VC2015的工程向导新建一个ATL的工程名字叫myAtl,那么VC会同时给我生成一个叫做myAtlPS的工程。这个myAtlPS工程是做什么的?什么情况下可以不需要它?什么情况下它又是必须存在的? PS工程是什么?可以不要吗? 这个PS工程叫做代理与存根(proxy&nbs...

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    现象:程序在xp系统上面总是莫名其妙的崩溃,检查代码看不出任何问题,感觉代码都很好。即使你远程调试,找到了崩溃的点,当你注释了崩溃点之后,还是会崩溃到别的地方。当你遇到了这种情况的时候,不妨参照一下下面的方法看看,说不定可以解决问题。如何解决?将崩溃程序相关的所有工程代码全部关闭全局变量的线程安全检...