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