C++ 最简单的 '智能指针' 的实现
在C++中使用 new 堆中申请了一块内存,在你使用完成后要“记得” 去释放它(delete),不然这块内存就浪费掉了。
但是让所在程序员都”记得“ 这件事儿本身就不靠谱。 特别是在程序变得很大之后。 没有人会记得所有你需要释放的内存。
这时候 就想如果能像 C#那样。程序自己去管理内存就太爽了。很大程度的给程序员减负呀~~~~
在C++ memory.h 中就有一个这种类的实现 auto_ptr.
先说下它的原理, 很简单。 就是用栈中的变量去释放堆中的内存,因为 栈中的变量是在不需要的时候自动释放掉的。 这样我们就可以
在这个变量的析构函数中去 delete 掉这块内存了。
比如 : 这样一个简单的类
 1 class Person
 2 
 3 {
 4    private:
 5      string _name;
 6      int _age;
 7          public:
 8              Person(string name,int age) {
 9                   this->_name = name;
10                   this->_age = age;
11              }      
12          void Print() {
13                cout << "Name : " << _name << " age : " << _age << endl;
14          }
15 };    
在栈中创建的话是这样 : Person per("Hello world",45);
在堆中是这样的使用 New : Person* per = new Person("Hello world",45); 这时 per 是一个指针
Ok。。 这面我们来 用最简单的代码去实现一下。可以自动释放内存的类
 1 #include <iostream>
 2 #include <string>
 3 
 4 template<class T>
 5 class auto_ptr
 6 {
 7 private:
 8     T* _ptr;
 9 public:
10     // 构造函数,传入一指针
11     auto_ptr(T* ptr){
12         _ptr = ptr;
13     }
14 
15     // 析构函数,清除内存
16     ~auto_ptr(){
17         if (_ptr != NULL)
18         {
19             delete _ptr;
20             _ptr = NULL;
21         }
22     }
23 
24     // 重写 -> 操作符
25     T* operator -> () {
26         return _ptr;
27     }
28 };
29 
30 #endif
这个类中 有一个 私有的 T* _ptr . 这样就可以接受任意类型的指针了。 并在构造函数中, 但一个 指针赋给这个变量。 主要部分就是在它的 析构函数中,去delete 掉 _ptr 所指向的那块内存。
还有你需要重载 -> 这个运算符。 这样才能像使用指针那样。使用这个类了。
下面就是如何使用这个类:
int main(){ // 这一句的意思是,在栈中申请一个变量 auto_ptr<Person> per // 它是在栈中的,所以可以自动被释放 // 这个 ‘=‘ 号就是调用了, auto_ptr 的构造函数,将 // new Person("Hello World",45),所传回的指针,赋给 auto_ptr 里面的 _ptr 变量 auto_ptr<Person> per = new Person("ZhouTianChi",30); // 这里就使用了我们auto_ptr 中的重截的 -> 运算符 // 其实就是 auto_ptr 里面的 _ptr->print(); per->Print(); return 0; }
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号