导读:本期聚焦于小伙伴创作的《如何动态分配C++数组 new和delete操作符的正确用法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何动态分配C++数组 new和delete操作符的正确用法》有用,将其分享出去将是对创作者最好的鼓励。

在C++程序开发中,动态分配数组是处理不确定长度数据集合的常用手段,new和delete操作符是完成这一操作的核心工具,正确的使用方式直接关系到程序的内存安全和运行稳定性。

如何动态分配C++数组 new和delete操作符的正确用法

一、new和delete操作符的基础作用

new操作符用于在堆内存中分配指定大小的空间,并返回对应类型的指针,而delete操作符则用于释放之前通过new分配的内存空间,避免内存泄漏。对于数组场景,需要使用带方括号的new[]和delete[]组合,这是很多初学者容易混淆的点。

1. 单个元素的动态分配

如果只需要分配单个元素,使用普通的new和delete即可,示例如下:

#include <iostream>
using namespace std;

int main() {
    // 动态分配一个int类型的元素
    int* num = new int;
    *num = 10;
    cout << "动态分配的单个元素值:" << *num << endl;
    // 释放单个元素的内存
    delete num;
    num = nullptr; // 避免野指针
    return 0;
}

2. 动态数组的分配与释放

当需要分配数组时,必须使用new[]操作符,对应的释放操作必须使用delete[],否则会导致内存释放不完整,引发程序异常。示例如下:

#include <iostream>
using namespace std;

int main() {
    int arr_size = 5;
    // 动态分配一个包含5个int元素的数组
    int* arr = new int[arr_size];
    // 给数组元素赋值
    for (int i = 0; i < arr_size; i++) {
        arr[i] = i * 2;
    }
    // 输出数组元素
    for (int i = 0; i < arr_size; i++) {
        cout << "arr[" << i << "] = " << arr[i] << endl;
    }
    // 释放动态数组的内存,必须使用delete[]
    delete[] arr;
    arr = nullptr;
    return 0;
}

二、常见错误用法及避坑方案

  • 错误1:new[]分配的数组用delete释放

    这种错误会导致只有数组的第一个元素被释放,剩余元素的内存泄漏,严重时会引发程序崩溃。必须保证new[]和delete[]严格配对。

  • 错误2:重复释放同一块内存

    对已经释放过的指针再次调用delete,会导致未定义行为,通常表现为程序崩溃。释放内存后将指针置为nullptr可以有效避免这个问题。

  • 错误3:忘记释放动态分配的内存

    如果动态分配的内存没有对应的delete操作,会导致内存泄漏,长期运行的程序会占用越来越多的内存,最终可能耗尽系统资源。

  • 错误4:动态数组长度使用变量时的注意事项

    C++11之前,普通数组的长度必须是编译期常量,而new[]支持使用运行期变量作为数组长度,这是动态数组的核心优势。但需要保证长度变量的值是合法的正整数,避免分配长度为0或者负数的数组。

三、自定义类型动态数组的处理

如果动态数组的元素是自定义类类型,new[]会为每个元素调用默认构造函数,delete[]会为每个元素调用析构函数,这一点和普通内置类型不同,需要额外注意构造和析构的逻辑是否正确。

#include <iostream>
#include <cstring>
using namespace std;

class Student {
public:
    char* name;
    int age;
    Student() {
        name = new char[20];
        strcpy(name, "默认学生");
        age = 0;
        cout << "调用Student默认构造函数" << endl;
    }
    ~Student() {
        delete[] name;
        cout << "调用Student析构函数" << endl;
    }
};

int main() {
    // 动态分配3个Student对象的数组
    Student* students = new Student[3];
    // 释放数组时,会依次调用每个元素的析构函数
    delete[] students;
    return 0;
}

上述示例中,new Student[3]会调用三次Student的默认构造函数,delete[] students会调用三次Student的析构函数,确保每个对象的name成员内存都被正确释放。

四、使用建议

实际开发中,如果不是必须手动管理内存,优先使用标准库中的std::vector容器替代手动动态分配的数组,vector会自动管理内存的分配和释放,大幅降低内存泄漏和野指针的风险。如果确实需要手动使用new和delete,一定要严格遵循匹配规则,分配后及时释放,释放后重置指针,避免各类内存相关问题。

C++动态数组new操作符delete操作符修改时间:2026-06-19 05:18:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。