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日

相关文章

  • C语言传递字符常量的指针

    下面详细讲解一下“C语言传递字符常量的指针”的完整使用攻略。 标准语法 在C语言中,字符常量实际上是一个指向字符数组的指针,因此在函数中传递字符常量时,应该使用指针参数。 void function_name(char *pointer); 其中,function_name为函数名,pointer为字符常量的指针。 示例一 下面以输出字符常量为例进行说明。 …

    C 2023年5月9日
    00
  • 详解C++中基类与派生类的转换以及虚基类

    让我们来详解C++中基类与派生类的转换以及虚基类。 基类与派生类的转换 向上转型 在C++中,基类和派生类之间可以相互转换。向上转型是指将一个派生类对象转换为其基类对象,这种转换是自动进行的,因为派生类包含了基类的所有成员,而且这些成员在内存中的布局顺序是相同的。例如: class Animal { public: virtual void voice() …

    C 2023年5月22日
    00
  • SpringBoot使用前缀树过滤敏感词的方法实例

    下面是“SpringBoot使用前缀树过滤敏感词的方法实例”的完整攻略。 一、前缀树概念 前缀树,也称字典树或Trie树,是一种树形数据结构,用于高效地存储和检索字符串数据集。 前缀树的每一个节点都代表一个字符串的前缀,从根节点到每一个叶子节点构成的路径即为一个字符串。除根节点外,每一个节点都有若干个指向其子节点的边,每一条边上都标注有一个字符,代表从父节点…

    C 2023年5月23日
    00
  • Win7系统蓝屏提示0x000000CA错误代码的解决方法

    Win7系统蓝屏提示0x000000CA错误代码的解决方法 前言 在使用Windows 7操作系统的过程中,有时候会遇到蓝屏错误提示,其中错误代码为0x000000CA。此错误通常与内存的使用有关,但具体问题可能很多。本文将提供一些解决方案,帮助您解决这个问题。 解决方案 方法一:检查硬件 首先,我们需要检查硬件是否正常工作。有一些问题可能会导致0x0000…

    C 2023年5月23日
    00
  • C/C++ Qt 运用JSON解析库的实例代码

    下面将为您详细讲解在C/C++ Qt中运用JSON解析库的实例代码的完整攻略。 一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON建立在两种结构上:一个用来表示值的简单原始类型(数字、字符串、布尔值、空值)以及一种集合值的有序列表(数组)和一个包含…

    C 2023年5月23日
    00
  • 淘宝直播间进不去怎么回事?怎么做?

    淘宝直播间进不去怎么回事?怎么做? 淘宝直播是淘宝平台上的一项直播服务,为商家提供直播卖货的渠道,吸引了大量用户。但是,用户在使用淘宝直播时,有时遇到无法进入直播间的问题,接下来我们将为大家介绍如何解决。 一、检查网络连接 首先,我们需要检查一下自己的网络连接是否正常。可以打开其他网站试试看,如果其他网站打得开,那就是淘宝平台的问题,如果其他网站也打不开,那…

    C 2023年5月23日
    00
  • C语言 struct结构体超详细讲解

    C语言 struct 结构体超详细讲解 什么是C语言结构体? C语言中的结构体是一种自定义数据类型,可以将多个不同数据类型的变量打包成一个整体,方便程序中的数据组织和管理。 结构体的语法如下: struct 结构体名 { 数据类型1 变量名1; 数据类型2 变量名2; … 数据类型n 变量名n; }; 其中,结构体名是自定义的名称,可以根据需要进行修改。…

    C 2023年5月23日
    00
  • 教你如何使用qt quick-PathView实现好看的home界面

    针对题目所提到的内容,我将会给出完整攻略如下,在此过程中会采用示例说明的方式,方便理解: 一、什么是PathView Qt Quick PathView是一个QML组件,它提供了一种沿路径呈现的数据视图。与QtQuick控件QListView和QGridView不同,PathView中的项目沿着UserEditablePath移动布局。PathView灵活性…

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