C++内存管理神器之模板化的智能指针

先上代码(MinGW下编译测试通过):

C++标准类库里面有实现智能指针auto_ptr,位于头文件<memory>。

 

01 /*
02  * SmartPointer.h
03  *
04  *  Created on: 2010-10-27
05  *      Author: LayzerAr
06  */
07   
08 #ifndef __SMARTPOINTER_H_INCLUDE__
09 #define __SMARTPOINTER_H_INCLUDE__
10   
11 template<class T>
12 class SmartPointer {
13 public:
14     SmartPointer(T* ptr = 0) :
15         Ptr(ptr) {
16     }
17   
18     SmartPointer(SmartPointer<T>& other) :
19         Ptr(other.Ptr) {
20         other.Ptr = 0;
21     }
22   
23     virtual ~SmartPointer() {
24         release();
25     }
26   
27     SmartPointer<T>& operator=(SmartPointer<T>& other) {
28         if (this != &other) {
29             this->Ptr = other.Ptr;
30             other.Ptr = 0;
31         }
32         return *this;
33     }
34   
35     T& operator*() const {
36         return *Ptr;
37     }
38   
39     T* operator->() const {
40         return Ptr;
41     }
42   
43     void release() {
44         if (Ptr != 0) {
45             delete Ptr;
46             Ptr = 0;
47         }
48     }
49   
50     void reset(T* newptr) {
51         if (Ptr != newptr) {
52             release();
53             Ptr = newptr;
54         }
55     }
56   
57 private:
58   
59     T* Ptr;
60 };
61   
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++内存管理。

你可能感兴趣的:(C++,object,delete,Class,include,作业)