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;
 }

 

 

     

 

转载于:https://www.cnblogs.com/runningRain/p/5930638.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值