先上代码(MinGW下编译测试通过):
C++标准类库里面有实现智能指针auto_ptr,位于头文件<memory>。
/* * SmartPointer.h * * Created on: 2010-10-27 * Author: LayzerAr */ #ifndef __SMARTPOINTER_H_INCLUDE__ #define __SMARTPOINTER_H_INCLUDE__ template<class T> class SmartPointer { public: SmartPointer(T* ptr = 0) : Ptr(ptr) { } SmartPointer(SmartPointer<T>& other) : Ptr(other.Ptr) { other.Ptr = 0; } virtual ~SmartPointer() { release(); } SmartPointer<T>& operator=(SmartPointer<T>& other) { if (this != &other) { this->Ptr = other.Ptr; other.Ptr = 0; } return *this; } T& operator*() const { return *Ptr; } T* operator->() const { return Ptr; } void release() { if (Ptr != 0) { delete Ptr; Ptr = 0; } } void reset(T* newptr) { if (Ptr != newptr) { release(); Ptr = newptr; } } private: T* Ptr; }; #endif /* __SMARTPOINTER_H_INCLUDE__ */
概述:
我们经常为C++的内存管理叫苦不迭,简单的代码还好,稍微复杂一点,可能就会忘记delete掉new出来的对象,这样就造成了内存泄漏,多次delete可能会使程序崩溃。
为什么说模板化的智能指针是C++内存管理的神器呢?
首先,我们必须改变代码风格:不再返回指针Object*,取而代之用SmartPointer<Object>(非指针、非引用),并且在该模板类的实例里面保存有我们需要的指针Object*。
那么我们来看一下:
SmartPointer类里面重载了解引用操作符,这意味着,我们可以直接用SmartPointer<Object>类的实例(obj->func(),*(obj).func())来访问Object的公有成员;
由于我们返回的SmartPointer<Object>并非是new出来的对象,所以当该变量超出了作业范围时,会根据析构函数(在析构函数中调用release()方法,这里我们定义了SmartPointer指向的Object*的析构规则)来析构本对象和期指向的对象,这意味着,我们即使忘了了调用delete也没关系,因为他会Object*指向的实例会跟随这SmartPointer变量一起被析构,多美妙啊;
在性能需求下,我们还可以调用release()方法主动析构掉Object*;
另外,由于这个SmartPointer经过了模板化,所以几乎可以适用与任何类的指针,只增加少量的代码,就轻松方便的实现了C++内存管理。
原文链接: https://www.cnblogs.com/LayzerAr/archive/2010/10/27/1862953.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/16646
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!