C++ 动态内存分配详解(new/new[]和delete/delete[])

C++ 动态内存分配详解(new/new[]和delete/delete[])

动态内存分配是指程序在运行期间根据需要动态地申请内存空间的过程,C++语言提供了new/new[]delete/delete[]运算符来进行动态内存分配和释放。

动态内存分配方式

new关键字动态分配单变量内存

语法格式:

new dataType;

对于上述语句,程序在运行期间会从堆空间中申请一块大小为sizeof(dataType)的内存空间,并根据数据类型的特点进行初始化,最后返回指向该空间首地址的指针。

示例代码如下:

#include <iostream>

int main() {
    int *p = new int;
    if (p == nullptr) {
        std::cerr << "Failed to allocate memory" << std::endl;
        return -1;
    }

    *p = 10;
    std::cout << *p << std::endl;

    delete p;
    p = nullptr;

    return 0;
}

程序运行结果:

10

new关键字动态分配数组内存

语法格式:

new dataType[arraySize];

对于上述语句,程序在运行期间会从堆空间中申请一块大小为sizeof(dataType) * arraySize的内存空间,并根据数据类型的特点对其中的每个元素都进行初始化,最后返回指向该空间首地址的指针。

示例代码如下:

#include <iostream>

int main() {
    int *p = new int[5];
    if (p == nullptr) {
        std::cerr << "Failed to allocate memory" << std::endl;
        return -1;
    }

    for (int i = 0; i < 5; ++i) {
        *(p + i) = 10 * i;
        std::cout << *(p + i) << " ";
    }
    std::cout << std::endl;

    delete[] p; // 注意:动态分配的数组需要用delete[]进行释放
    p = nullptr;

    return 0;
}

程序运行结果:

0 10 20 30 40

delete关键字释放动态分配的单变量内存

语法格式:

delete ptr;

对于上述语句,delete关键字会释放指针ptr所指向的动态内存空间,并将该指针置为nullptr

示例代码如下:

#include <iostream>

int main() {
    int *p = new int;
    if (p == nullptr) {
        std::cerr << "Failed to allocate memory" << std::endl;
        return -1;
    }

    *p = 10;
    std::cout << *p << std::endl;

    delete p;
    p = nullptr;

    std::cout << *p << std::endl; // 此处会出现错误,因为指针已经被释放

    return 0;
}

delete关键字释放动态分配的数组内存

语法格式:

delete[] ptr;

对于上述语句,delete[]关键字会释放指针ptr所指向的动态内存空间(即动态分配的数组),并将该指针置为nullptr

示例代码如下:

#include <iostream>

int main() {
    int *p = new int[5];
    if (p == nullptr) {
        std::cerr << "Failed to allocate memory" << std::endl;
        return -1;
    }

    for (int i = 0; i < 5; ++i) {
        *(p + i) = 10 * i;
        std::cout << *(p + i) << " ";
    }
    std::cout << std::endl;

    delete[] p;
    p = nullptr;

    std::cout << *(p + 1) << std::endl; // 此处会出现错误,因为指针已经被释放

    return 0;
}

动态内存分配的应用场景

动态内存分配在以下情况下比较常见:

  1. 当程序无法预知需要分配多大的内存空间时,可以通过动态内存分配来获取所需空间;
  2. 当程序需要在函数内部创建一个较大的数组,但是又不希望在栈空间上分配该数组时,可以通过动态内存分配来避免可用栈空间不足的问题;
  3. 当程序要返回值为一个数组或结构体时,可以通过动态内存分配来获取该数组或结构体的内存空间,并在函数结束前将其释放。

总结

动态内存分配是C++语言中非常重要的一部分,在实际开发中需要掌握其使用方式和注意事项,避免内存泄漏和指针悬空等问题的出现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 动态内存分配详解(new/new[]和delete/delete[]) - Python技术站

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

相关文章

  • iOS读写json文件的方法示例

    在这里我将为你展示“iOS读写json文件的方法示例”的完整攻略,包括基本概念、操作步骤、示例代码和执行结果等方面的内容。 基本概念 在开始讲述攻略之前,我们需要了解一些基本概念: JSON:是一种轻量级的数据交换格式,具有可读性、易于解析和生成等特点。 JSON文件:是以JSON格式编写的文件,通常用于数据存储和传输。 操作步骤 想要在iOS中实现读写JS…

    C 2023年5月23日
    00
  • C语言编写获取Linux本地目录及本机信息的小程序实例

    下面是详细讲解“C语言编写获取Linux本地目录及本机信息的小程序实例”的完整攻略: 1. 程序的概要 该程序主要通过C语言来获取Linux本地目录以及本机信息,包括以下功能: 获取当前程序所在目录 获取主机名和IP地址 获取系统空闲内存大小 获取磁盘剩余空间大小 获取系统时间 2. 程序实现步骤 2.1 获取当前程序所在目录 要获取当前程序所在目录,可以使…

    C 2023年5月23日
    00
  • c++ #include是怎么样工作的?

    当我们在编写 C++ 程序时, 有时需要使用其它文件中定义的函数或变量,那么我们就需要使用 #include 语句把这个文件包含进来。在 C++ 中,#include 是一个预处理命令。 下面来详细讲解“C++ #include 是怎么样工作的?”的完整攻略: 1. #include 的作用 include 是 C++ 中的一个预处理命令,用于包含一个文件到…

    C 2023年5月23日
    00
  • C#中ToString数据类型格式大全(千分符)

    C#中的ToString()方法可以将一个对象转换成字符串类型。当我们使用ToString()方法时,可以携带一个参数。这个参数可以是标准格式字符串,也可以是自定义格式字符串。在这个参数中,我们可以设置Convert类中的几种数据类型格式。 以下是数据类型格式大全: c/C:货币(Currency)格式; d/D:十进制(Decimal)格式; e/E:科学…

    C 2023年5月24日
    00
  • 详解利用C语言如何实现简单的内存池

    利用C语言实现简单的内存池一般可以分为以下步骤: 步骤一:自定义内存池数据结构 首先,我们需要自定义一个内存池的数据结构,一般包含以下几个要素: 内存池的大小(即可分配的内存总大小) 内存块的大小(即每个可分配的内存块的大小) 空闲内存块的数量(即尚未被分配的内存块的数量) 内存块的首地址(即内存池的起始地址) 我们可以使用结构体来表示这些要素,例如: st…

    C 2023年5月23日
    00
  • c#操作json示例分享

    下面我将为你详细讲解如何使用C#操作JSON。 首先,我们需要了解C#中的JSON库。C#自带了一个System.Text.Json的库,它能够实现将JSON字符串转换为C#对象以及将C#对象转换为JSON字符串,而且相比其他的JSON库,它的性能更加出色。 下面是一些常用的操作: 将JSON字符串转换为C#对象 使用System.Text.Json库将JS…

    C 2023年5月23日
    00
  • C#使用Clipboard类实现剪贴板功能

    C#使用Clipboard类实现剪贴板功能 导读 剪贴板是电脑生产过程中至关重要的一部分,通过使用剪贴板,我们可以在不同的应用程序和文本之间快速、方便地复制和粘贴数据。在C#中,我们可以使用Clipboard类来实现剪贴板的功能,本文将详细讲解如何在C#应用程序中使用Clipboard类来实现剪贴板功能。 使用Clipboard类 在C#中,Clipboar…

    C 2023年5月23日
    00
  • 最短时间学会基于C++实现DFS深度优先搜索

    最短时间学会基于C++实现DFS深度优先搜索攻略 什么是DFS深度优先搜索 DFS即深度优先搜索,是一种基于搜索算法的遍历和检索树或图数据结构的算法。DFS算法采用深度优先策略,从根结点出发访问所有可达结点,直到叶子节点。在访问某个结点时,先访问该结点的第一个未访问的相邻节点,然后递归的访问其非相邻节点。其搜索的核心思想是根据某个搜索方向向前搜索到底,直至无…

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