• C++学习之动态内存


    静态存储分配

    通常定义变量(或对象)后,编译器在编译时都可以通过该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配。

    动态存储分配

    有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。
    C++程序中的内存分为两个部分:

    • 栈:在函数内部声明的所有变量都将占用栈内存
    • 堆:这是程序中未使用的内存,在程序运行时可用于动态内存分配

    在c++中,可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址,这种运算符即new运算符,如果不再需要动态分配的内存空间,可以使用delete运算符,删除之前由new运算符分配的内存。

    1. 申请指针变量空间
    double* p=NULL;
    p=new double;
    delete p;  //释放
    
    • 1
    • 2
    • 3
    1. 申请一维数组空间
    int* p=	NULL;
    p=new int[20];
    delete[] p; //释放
    
    • 1
    • 2
    • 3
    1. 为二维数组分配空间
    int **p;
    int m,n; //第一维为m,第二维为n
    //首先申请行的内存空间
    p=new int*[m];
    //其次申请列的内存空间
    for(int i=0;i<m;i++){
    	p[i]=new int[n];	
    }
    //最后对二维数组进行释放
    for(int i=0;i<m;i++){
    	delete[] p[i];
    }
    delete[] p;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 为三维数组分配空间
    int ***p;
    int x,y,z;  //数组的第一维为x,第二维为y,第三维为z
    p=new int**[x];
    for(int i=0;i<x;i++){
    	p[i]=new int*[y];
    	for(int j=0;i<y;j++){
    		p[i][j]=new int[z];
    	}
    }
    //释放
    for(int i=0;i<x;i++){
    	for(int j=0;j<y;j++){
    		delete[] p[i][j];
    	}
    	delete[] p[i];
    }
    delete[] p;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    对象的动态内存分配

    #include 
    #include
    using namespace std;
    
    class Student{
        string sname;
    public:
        Student(string name){
            sname=name;
        }
        string show(){
            return sname;
        }
    };
    
    int main()
    {
        Student *stu=new Student("david");
        if(!stu){
            cout << "动态内存分配失败!" << endl;
            return 1;
        }
        cout << "name="<<stu->show() << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    自己理解的TCP三次握手
    JSX语法
    19_Nginx_模块、内存管理
    3A通过PMP考试有多大比例?
    Linux网络配置
    软信天成:物料主数据的标准管理
    3.Gen<I>Cam文件配置
    07-Redis【Redis主从复制,终于有人讲明白了】
    【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决
    基于蝴蝶算法的无人机航迹规划-附代码
  • 原文地址:https://blog.csdn.net/David_house/article/details/133967249