C++智能指针基本原理

什么是智能指针?

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

智能指针的基本实现

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;
}

本文为@艺文笔记原创文章,转载请注明出处:https://www.xuwenyan.com/archives/354,非常感谢!
上一篇:  下一篇: