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的过程结束而调用。

  • 相关阅读:
    阅读 Android源码的一些姿势
    Unity3d UGUI 界面适配 实例解析 三种适配方式
    Unity3D Android手机开发环境配置
    DOTween教程
    DoTween 部分中文文档
    C# 委托、事件,lamda表达式
    EditText中输入信息的限制的方法
    Android中shape中的属性大全
    Android 高版本API方法在低版本系统上的兼容性处理
    python 绘制f(x)=x^2
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2859039.html
Copyright © 2011-2022 走看看