先上代码(MinGW下编译测试通过):
C++标准类库里面有实现智能指针auto_ptr,位于头文件<memory>。
08 | #ifndef __SMARTPOINTER_H_INCLUDE__ |
09 | #define __SMARTPOINTER_H_INCLUDE__ |
14 | SmartPointer(T* ptr = 0) : |
18 | SmartPointer(SmartPointer<T>& other) : |
23 | virtual ~SmartPointer() { |
27 | SmartPointer<T>& operator=(SmartPointer<T>& other) { |
29 | this ->Ptr = other.Ptr; |
35 | T& operator*() const { |
39 | T* operator->() const { |
50 | void reset(T* newptr) { |
62 | #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++内存管理。