zoukankan      html  css  js  c++  java
  • 看C++智能指针而引发的感想

    最近在学习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的过程结束而调用。

  • 相关阅读:
    firstresponder 后,键盘不显示
    performSelector
    setNeedsDisplay、setNeedsLayout 区别
    Xcode 工程文件打开不出来, cannot be opened because the project file cannot be parsed.
    GCD介绍(一):基本概念和dispatch queues
    一些概念
    /mnt/sdcard /sdcard
    eclipse 导入已存在的工程文件出错
    ios 常用技巧
    ios nsstring去掉换行符
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2859039.html
Copyright © 2011-2022 走看看