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

 

posted @ 2012-12-28 12:44  easyfrog  阅读(381)  评论(0编辑  收藏  举报