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

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++内存四区指的是程序在运行时所使用的内存分为代码区、全局区、栈区和堆区。下面我们分别来讲解一下这四个区域。 1. 代码区 代码区是存储函数体等二进制代码的区域,它需要保护,以免被其他程序或者用户修改。代码区一般位于内存的高地址部分,从而防止由于栈溢出操作而覆盖代码区。 代码示例: #include <iostream> int main() …

    C 2023年5月24日
    00
  • C++ Primer 第一部分基本语言

    C++ Primer 第一部分基本语言攻略 1. C++语言基础 本章节主要介绍了C++语言的基础知识,包括C++程序的结构、语句、类型、变量等。 C++程序的结构 #include <iostream> //头文件 int main() //主函数 { std::cout <<"Hello, world!" &l…

    C 2023年5月22日
    00
  • C语言超详细讲解函数栈帧的创建和销毁

    C语言超详细讲解函数栈帧的创建和销毁 什么是函数栈帧? 函数栈帧也叫做栈帧,是存放函数局部变量、参数、函数返回地址等信息的一段内存空间。在函数被调用时,会动态地在栈上分配一段空间来存放函数栈帧,当函数执行完毕后释放这段空间。 函数栈帧的创建过程 当函数被调用时,会通过以下步骤创建函数栈帧: 将函数调用后下一条指令(即函数体里的第一条语句)的地址压入栈中,这里…

    C 2023年5月23日
    00
  • C++面向对象之类和对象那些你不知道的细节原理详解

    C++面向对象之类和对象那些你不知道的细节原理详解 什么是类 类是C++中定义自己的数据类型的方法。类可看作是一种用户自定义的数据结构。 我们可以通过定义变量来定义一个类的对象,这个对象就包含了类的属性和操作。 类的基本组成 成员变量 成员变量是类的属性,也称为数据成员、字段或属性。 相当于结构体中的成员变量,可以是任何C++数据类型,包括另一个类的对象。 …

    C 2023年5月23日
    00
  • C++中的friend函数详细解析

    C++中的friend函数详细解析 friend是C++语言中的一个关键字,用于在一个类中声明其它类或者函数成为友元,可以让友元类或者友元函数能够访问本类的私有成员。friend也是一个强大的功能,但是使用不当可能打破了类的封装性。 基本语法 在C++中,使用friend关键字声明一个友元类或者友元函数,例如: class MyClass{ private:…

    C 2023年5月22日
    00
  • Photoshop 打造溶液字母文字特效

    Photoshop 打造溶液字母文字特效 前言 此篇攻略将详细介绍如何利用 Photoshop 实现溶液字母文字特效。通过本篇文章的讲解,您将掌握以下技能: 制作基础文字效果 制作溶液材质效果 制作混合效果,完成溶液字母文字特效 准备工作 在开始制作溶液字母文字特效之前,请确保您已经安装好了最新版的 Photoshop,并准备好以下素材: 背景图片 字母素材…

    C 2023年5月22日
    00
  • C语言中如何进行排序和查找操作?

    C语言中进行排序和查找操作是非常常见和重要的操作,下面我将详细介绍排序和查找操作的常见方法和算法。 排序算法 冒泡排序 冒泡排序是一种简单的排序算法,它的基本思想是通过依次比较相邻的元素,将较大的元素后移,较小的元素前移,达到排序的目的。冒泡排序时间复杂度为O(n^2),是一种效率较低的算法。 示例代码: void bubble_sort(int array…

    C 2023年4月27日
    00
  • C语言设计前中后队列实例代码

    C语言设计前中后队列实例代码攻略 在本篇文章中,我们将学习如何在C语言中设计前、中、后队列,并提供相应的示例代码。下面将分别对前、中、后队列进行介绍和说明。 前队列 前队列,也称为顺序队列。它是一种数据结构,它具有先进先出(First in First Out,简称FIFO)的特点,是一种简单但基本的数据结构,常用在队列缓存、消息队列、web服务器等领域。下…

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