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

     

时间: 2024-12-28 10:47:05

C++动态分配内存的相关文章

C中动态分配内存

//使用动态分配内存时,要包含头文件<stdlib.h> //malloc的参数为要分配的内存的字节数 //其返回所分配内存的第一个字节的地址 //返回类型是void*,但实际中常常转换为具体类型便于使用 //如果因某种原因而不能分配将返回NULL指针,所以使用时应验证是否分配成功 int *pNumber1=(int *)malloc(100*sizeof(int)); //calloc把内存分配为给定大小的数组,并初始化分配的内存为0 //calloc需要两个参数,1为数组元素个数,2为数

动态分配内存专题

我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??既然有人会问这样的问题,那么我在这里好好的讲解一下吧!首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数):2)字符常量区:主要是储存一些字符常量,比如:char *p_str="cgat";其中"cgat"就储存在字符常量区里面:3)全局区:在全

标C编程笔记day06 动态分配内存、函数指针、可变长度參数

动态分配内存:头文件 stdlib.h malloc:分配内存 calloc:分配内存,并清零 realloc:调整已分配的内存块大小 演示样例: int *p=(int *) malloc(3*sizeof(int));//分配内存,成功返回首地址,失败返回NULL free(p);p=NULL;//释放分配的内存,并改动指针的值,避免出现野指针(指向一个地址,但地址已被回收) const 与指针: const int *p; //指针可变,指针相应的数据不可改动 int * const p;

c/c++动态分配内存和malloc的使用

c/c++动态分配内存  为什么需要动态分配内存 ---很好的解决的了传统数组的4个缺陷 动态内存分配举例 ---动态数组的构造 使用动态数组的优点:    1. 动态数组长度不需要事先给定: 2. 内存空间可以手动释放: 3. 在程序运行中, 动态内存空间大小可以通过realloc函数手动扩充或缩小  静态内存和动态内存的比较   静态内存是由系统自动分配,有系统自动释放 静态内存是在栈分配的 动态内存是由程序员手动分配,手动释放,动态内存是在堆分配的 动态内存和静态内存的比较 静态内存是由系

动态分配内存

1.自动分配内存:当定义一个基本类型的变量的时候,系统会为这个变量自动分配内存,这个内存在堆上.当作用域结束,系统        会自动讲这个内存回收. 动态分配内存:开发人员自己向系统申请的内存空间,申请的内存位于栈上,当作用域结束之后,系统是不会自动回收内存  的,这个内存必须由开发人员自己去释放,如果不释放,就内存泄露了. 2.什么时候需要动态分配内存 程序运行过程中,需要保存/记录相应的数据,但是有没有提前准备好内存,那么就需要临时动态分配内存. 3.使用的函数 void  *mallo

动态分配内存的初始化

9 下面哪种C/C++分配内存的方法会将分配的空间初始化为0 malloc() calloc() realloc() new[ ] 答案:B: 1) malloc 函数: void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化. 2)calloc 函数: void *calloc(unsigned int num, unsigned int si

比较C/C++和Delphi中的字符串和字符数组(数组和动态分配内存的情况)

本文所讲解的只是从其中一个方面来看待进行的总结,所以有必要结合<Delphi字符串与字符数组之间的转换(初始化的重要性)>等文章进行更全面的了解,会从更多方面来理解字符串.内存.类型转换 C/C++中的字符串.字符数组.字符指针分配的内存空间 我们知道在C/C++中,我们可以这样理解字符串和字符数组 1)字符串,就是一个以 '\0' 结尾的字符数组 2)字符数组,包括字符串,但是不一定要以 '\0' 结尾,如果不是以'\0' 结尾,那么就不能当做字符串使用 在C/C++中,使用字符串可以通过数

条款十一: 为需要动态分配内存的类声明一个拷贝构造函数和一个拷贝赋值运算符

看下面一个表示string对象的类: // 一个很简单的string类 class string { public: string(const char *value); ~string(); ... // 没有拷贝构造函数和operator= private: char *data; }; string::string(const char *value) { if (value) { data = new char[strlen(value) + 1]; strcpy(data, value

C语言-动态分配内存对任意个字符串进行排序

//动态分配内存对输入的任意字符串排序 #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> //比较大小 //int str_compare(const char* src,const char* dst) //{ // int ret = 0; // if (src == dst) // { // return 0; // } // if (dst == NU