c++ 动态内存分配相关总结

yizhihongxing

C++ 动态内存分配相关总结

C++ 中的动态内存分配是通过 newdelete 进行的,它们可以用来在程序运行时分配和释放内存。相比于静态内存分配,它具有更高的灵活性和可扩展性。

动态内存分配的基本使用

分配动态内存

new 运算符可以分配指定大小的动态内存,返回的是分配内存的首地址,需要通过指针接收:

// 分配一个 int 类型的动态数组
int *p = new int[10];

释放动态内存

使用分配内存时返回的指针,可以通过 delete 运算符将该内存释放掉:

delete[] p;

动态内存分配的异常处理

动态内存分配申请内存时可能会失败,比如内存空间不足,此时 new 返回空指针,可以使用 try...catch 语句进行异常处理:

try {
    int *p = new int[10000000];
}
catch (std::bad_alloc &ex) {
    std::cout << "动态内存分配失败:" << ex.what() << std::endl;
    return -1;
}

动态内存分配的注意事项

内存泄漏

动态内存分配后,需要及时释放,否则会造成内存泄漏,导致程序运行过程中内存不断累积,最终导致严重的系统崩溃。

int main() {
    while (true) {
        // 分配一个 int 类型的动态数组
        int *p = new int[10000];
    }
    return 0;
}

在上述代码中,每次循环分配了一个 int 类型的动态数组,但是没有进行释放,最终导致内存泄漏,程序会占用越来越多的内存,最终会因为内存耗尽而崩溃。

越界访问

动态分配内存时,需要注意数组的大小,否则会发生越界访问的问题。

int main() {
    // 分配一个 int 类型的动态数组
    int *p = new int[10];

    // 访问数组时,要确保下标在合法范围内
    p[10] = 0;

    // 释放内存
    delete[] p;

    return 0;
}

在上述代码中,数组大小只分配了 10 个 int 类型的空间,但是访问了第 11 个元素,导致了越界访问的问题。

示例1:动态分配二维数组

使用动态内存分配可以方便地分配二维数组,其基本方法是先分配一维数组,然后在循环中为每个一维数组分配二维数组的空间。

int **Create2DArray(int row, int col) {
    // 分配一维数组
    int **arr = new int *[row];

    // 分配二维数组
    for (int i = 0; i < row; ++i) {
        arr[i] = new int[col];
    }

    return arr;
}

在这个函数中,我们首先分配了一个包含 row 个指针的数组,然后循环遍历每个指针,为它分配 col 个 int 类型的空间。最终返回这个二维数组的指针。

示例2:动态分配结构体数组

使用动态内存分配,可以轻松地分配结构体数组,可以使用动态内存分配的方式来实现:

struct Student {
    std::string name;
    int age;
};

Student *CreateStudentArray(int n) {
    // 分配结构体数组的空间
    Student *arr = new Student[n];

    // 对数组进行初始化
    for (int i = 0; i < n; ++i) {
        arr[i].name = "John Doe";
        arr[i].age = 20;
    }

    return arr;
}

在这个函数中,我们首先分配了一个包含 n 个结构体的数组,然后循环遍历每个结构体,对其中的字符串和整数进行初始化。最终返回这个结构体数组的指针。

以上是对于 C++ 动态内存分配的相关总结,包括了基本使用方法、注意事项及两个示例说明。在程序设计中,动态内存分配可以帮助我们快速方便地分配内存,提高程序的灵活性和可扩展性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++ 动态内存分配相关总结 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 基于c++中的默认拷贝函数的使用详解

    基于C++中的默认拷贝函数的使用详解 在C++中,当我们定义了一个类,并对其进行实例化时,如果没有手动定义拷贝构造函数或拷贝赋值运算符,那么编译器会自动为该类提供默认的拷贝构造函数和拷贝赋值运算符。本文将详细讲解这两种默认拷贝函数的使用。 默认拷贝函数的定义 默认拷贝函数的定义如下: class MyClass { public: MyClass(const…

    C 2023年5月22日
    00
  • 从历史讲起JavaScript基因里的函数式编程实例

    下面就是从历史讲起JavaScript基因里的函数式编程实例的完整攻略。 什么是JavaScript基因里的函数式编程 在了解JavaScript基因里的函数式编程之前,我们需要先了解什么是函数式编程。 函数式编程(Functional Programming)是一种编程范式,它将计算机运算当成数学中的函数运算,并且避免了改变状态和可变数据。函数式编程的特点…

    C 2023年5月22日
    00
  • 彻底掌握C语言strcat函数的用法

    下面是对彻底掌握C语言strcat函数用法的攻略: 一、strcat函数简介 strcat函数是C语言中的一个字符串拼接函数(concatenate的缩写),用于将一个字符串追加到另一个字符串的末尾。该函数的声明如下: char* strcat(char* dest, const char* src); 函数原型解释:- dest:代表目标串,即将源串的内容…

    C 2023年5月23日
    00
  • C语言中strcmp的实现原型

    好的。首先我们来介绍一下strcmp函数的用法和定义: strcmp函数是C标准库中的一个字符串比较函数,用于比较两个字符串是否相等,如果相等则返回0,否则返回非0值。该函数原型如下: int strcmp(const char* str1, const char* str2); 该函数接收两个参数。第一个参数是要进行比较的字符串str1,第二个参数是与之进…

    C 2023年5月23日
    00
  • Android编程实现根据经纬度查询地址并对获取的json数据进行解析的方法

    针对“Android编程实现根据经纬度查询地址并对获取的json数据进行解析的方法”,我们可以采用以下步骤: 在AndroidManifest.xml中添加必要的权限声明: <uses-permission android:name="android.permission.INTERNET" /> <uses-permi…

    C 2023年5月23日
    00
  • C语言实现推箱子游戏

    C语言实现推箱子游戏攻略 推箱子(Sokoban)是一款经典的益智游戏,玩家需要在推推小车的帮助下,把箱子放到指定位置。本文将详细讲解如何用C语言实现推箱子游戏。 程序概述 本程序将会实现以下功能: 在命令行界面中显示地图; 使用WASD或方向键等控制字符移动,推动箱子; 判断胜利条件,即是否所有箱子都被成功推到目标位置。 程序设计 地图设计 地图由 C语言…

    C 2023年5月23日
    00
  • CDay03

    字符类型 编码 char类型采用ASCII编码,占1个字节,只用了7位(最高位是0),能表示128个字符。 需要记忆的: 空字符 ‘\0’ = 0 ‘ ‘ = 32 ‘0’ = 48 ‘A’ = 65 ‘a’ = 97 转义序列 字符转义序列 数字转义序列 八进制:以 \ 开头,后面最多接三个八进制数 十六进制:以 \x 开头,后面接十六进制数 字符处理函数…

    C语言 2023年4月18日
    00
  • 一文详解C++的程序流程控制

    一文详解C++的程序流程控制 程序流程控制是指程序中用来控制代码执行顺序和逻辑的语句,包括条件语句、循环语句以及跳转语句。本文将详细讲解C++中的程序流程控制语句及其使用方法。 条件语句 条件语句用于判断特定条件是否满足,并根据条件的真假执行不同的代码块。 if语句 if语句是最基本的条件语句。它的语法格式如下: if (条件表达式) { //条件表达式为真…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部