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

C++智能指针基本原理

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

什么是智能指针?

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

智能指针的基本实现

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++智能指针基本原理” 的相关文章

    c++获取程序的最后使用时间

    c++获取程序的最后使用时间

    杀软的软件管家里面,卸载列表会显示出软件的最近使用时间,以帮助用户清晰的查看该软件的使用频次,那这个时间是怎么获取到的呢。其实系统在打开一个软件时基本都有记录打开时间,当然并不是每一个可执行程序都能得到这个时间。我们可以从注册表和Prefetch文件夹中获取最近打开时间,下面的例子我会优先选择从注册...

    7z的简介和使用

    7z的简介和使用

    7z是一个支持多种压缩格式的开源项目,由Igor Pavlov开发,源码下载位置:https://www.7-zip.org/download.html源码结构项目源码目录结构是如下图:Asm包含主要算法实现的汇编代码,直接使用汇编的好处是可以提高运行效率,当然这对跨平台的支持不是很好。C主要是算法...

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