最近在学习C++,C++有用new和不用new来创建对象,但是两者是有区别的,用new的话,那就要程序员自己去分配和释放内存,因为对象存储在堆中,而不用new呢,对象存储在栈中,栈中的内存是由系统来管理的,不用程序员去释放,那么可以利用这一点,来达到一个目的,就是利用栈中对象随过程的消失而自动调用对象的析构函数释放对象,智能指针就是利用这个特新,如果我们将所有的动态分配的资源放在对象中,那么我们不就可以不用去关心内存是否真的释放了,不用去手动delete,这样就可以解决内存泄漏的问题。
下面是写的智能指针的简化版:
1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 private: 8 int n; 9 10 public: 11 A(int m):n(m){ 12 } 13 14 ~A(){ 15 cout<<"~A() is called\n"; 16 } 17 18 int get() const{ 19 return n; 20 } 21 }; 22 23 class B //A的资源管理类 24 { 25 private: 26 A* a; 27 28 public: 29 B(A* b):a(b){ 30 } 31 32 ~B(){ 33 delete a; //在B中释放A所占的内存 34 cout<<"~B() is called\n"; 35 } 36 37 A* get() const{ 38 return a; 39 } 40 }; 41 42 int main(void) 43 { 44 B b(new A(8)); 45 A* a = b.get(); //不需要写delete(a),也不要写delete b 46 int n = a->get(); 47 cout<<n<<endl; 48 return 0; 49 }
运行截图如下:
A的析构函数随着B的过程结束而调用。