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

    动态分配(Dynamic Memory)内存是指在程序运行时(runtime)根据用户输入的需要来分配相应的内存空间。

    1.内存分配操作符new 和 new[]

    Example:

    (1)给单个元素动态分配内存

    int * pointer = new int;           //动态分配一个用于存放整型变量的内存空间,并将该存储空间的地址返回给pointer

    (2)给多个元素(数组)动态分配内存空间

    int * p = new int [10];         //动态分配可以存放10个整型变量的内存空间,并将该存储空间的首地址返回给 p

    在这里,动态创建的数组 p 的长度可以是常量,也可以是变量(用户输入的长度);而一般的数组在创建时的长度必须是常量。

    2.内存收回操作符delete 和 delete[]

    与上面两种情况分别对应的内存收回操作符为:

    delete pointer;            //收回动态分配的单个元素的内存空间
    delete [] p;             //收回动态分配数组的内存空间

    3.Demo

    #include <iostream>
    using namespace std;
    int main() {
        char input[100];
        int i, n;
        long * p;
        cout << "How many numbers do you want to type in ? "<<endl;
        cin.getline(input, 100); 
        i = atoi(input);
        p = new long[i];                    //根据输入的长度来动态创建内存空间
        if (p == NULL)                     //检查所请求的内存是否成功分配
            exit(1);
        for (n = 0; n < i; n++) {
            cout << "Please enter number: ";
            cin.getline(input, 100);
            p[n] = atol(input);
        }
        cout << "You have entered: ";
        for (n = 0; n < i; n++) {
            cout << p[n] << ", ";
        }
        cout << endl;
        delete[] p;                            //回收已分配的内存空间
        system("pause");
        return 0;
    }

    result:

    4.关于二维数组的内存动态分配问题

    (1)二维数组的动态内存分配方式:

    int **p = new int *[row];                   //其中row指的是二维··数组的行数
    for(int i=0;i<row;i++)
    {
        p[i]=new int [col];                    //col 是二维数组的列,p 是一个指向 int 类型的指针
    }    

    (2)删除这个二维数组分配的内存空间的方式:

    for(int i=0;i<row;i++)
    {
        delete[] p[i];            //先删除二维数组的列
    } 
    delete[] p;                    //再删除二维数组的行

     (3)Demo

    #include<iostream>
    using namespace std;
    int main()
    {
        double **data;
        int m, n;
        cout << "Please input the row:" << endl;
        cin >> m;
        cout << "Please input the column: " << endl;
        cin >> n;
        data = new double*[m];            //申请行的空间
        if (data == NULL)                //检查内存是否分配成功
        {
            cout << "Could not allocate." << endl;
            exit(1);
        }
        for (int i = 0;i < m;i++)
        {
            data[i] = new double[n];    //申请列的空间
            if (data[i] == NULL)
            {
                cout << "Could not allocate,Bye..." << endl;
                exit(1);
            }
        }                                //申请空间结束,接下来进行初始化操作
        for (int i = 0;i < m;i++)        //初始化数组
        {
            for (int j = 0;j < n;j++)
            {
                data[i][j] = i*n + j;
            }
        }
        
        for (int i = 0;i < m;i++)        //输出数组
        {
            for (int j = 0;j < n;j++)
            {
                cout << data[i][j] << "  ";
            }
            cout << endl;
        }
        for (int i = 0;i < m;i++)        //释放动态分配的内存
            delete[] data[i];
        delete[] data;
        system("pause");
        return 0;
     }

         

  • 相关阅读:
    正则判断密码强弱
    QQ号码正则判断
    简单正则验证
    计算星期几
    实现这一天是这一年中的第几天
    倒计时
    选项卡放大镜(淘宝购物效果)
    遮罩层放大镜
    普通放大镜
    分布式事务解决方案(一) 2阶段提交 & 3阶段提交 & TCC
  • 原文地址:https://www.cnblogs.com/runningRain/p/5930638.html
Copyright © 2011-2022 走看看