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