zoukankan      html  css  js  c++  java
  • C++ 动态内存

    C++ 程序中的内存分为两个部分

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

    1.new 运算符

    为给定类型的变量在运行时分配堆内的内存,返回所分配的空间地址。
    

     

    检查 new 运算符是否返回 NULL 指针,并采取以下适当的操作:

    double* pvalue  = NULL;
    if( !(pvalue  = new double ))
    {
       cout << "Error: out of memory." <<endl;
       exit(1);
     
    }

      注意:

         关于malloc()函数:malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。

              new不仅分配了内存,还创建了对象。

    2.delete 运算符

    释放它所占用的内存
    #include <iostream>
    using namespace std;
     
    int main ()
    {
       double* pvalue  = NULL; // 初始化为 null 的指针
       pvalue  = new double;   // 为变量请求内存
     
       *pvalue = 29494.99;     // 在分配的地址存储值
       cout << "Value of pvalue : " << *pvalue << endl;
     
       delete pvalue;         // 释放内存
     
       return 0;
    }

    3.数组的动态内存分配

    a.一维数组

    char* pvalue  = NULL;   // 初始化为 null 的指针
    pvalue  = new char[20]; // 为变量请求内存
    // 动态分配,数组长度为 m 
    int *array=new int [m]; 
    //释放内存 
    delete [] array;

    b.二维数组(特别注意,二维数组删除时需要按维度删除

    int **array
    // 假定数组第一维长度为 m, 第二维长度为 n
    // 动态分配空间
    array = new int *[m];
    for( int i=0; i<m; i++ )
    {
        array[i] = new int [n]  ;
    }
    //释放
    for( int i=0; i<m; i++ )
    {
        delete [] arrar[i];
    }
    delete [] array;

    c.三维数组(同二维)

    int ***array;
    // 假定数组第一维为 m, 第二维为 n, 第三维为h
    // 动态分配空间
    array = new int **[m];
    for( int i=0; i<m; i++ )
    {
        array[i] = new int *[n];
        for( int j=0; j<n; j++ )
        {
            array[i][j] = new int [h];
        }
    }
    //释放
    for( int i=0; i<m; i++ )
    {
        for( int j=0; j<n; j++ )
        {
            delete array[i][j];
        }
        delete array[i];
    }
    delete [] array;

    d.对象内存分配

    分配方式相同,只是删除时需要注意。

     delete ptr // 代表用来释放内存,且只用来释放ptr指向的内存。
     delete[] rg // 用来释放rg指向的内存,还逐一调用数组中每个对象的 destructor!!

    int/char/long/int*/struct 等等简单数据类型,由于对象没有 destructor,所以用 delete 和 delete [] 是一样的!

     

  • 相关阅读:
    集训笔记——dp继续
    集训笔记——各种dp(dp杂谈)
    集训笔记——dp
    洛谷P3197 [HNOI2008]越狱 题解
    集训笔记——杂题选讲(图论,dp)
    集训笔记——杂题选讲(带数学推导的递推、递归和dp,卡特兰数)
    滑动窗口+二分--P3957 跳房子
    差分+二分答案--P1083 借教室
    逆序对--P1966 火柴排队
    数位dp--P2657 [SCOI2009] windy 数
  • 原文地址:https://www.cnblogs.com/amwuau/p/7601614.html
Copyright © 2011-2022 走看看