C++中new和new[]的核心区别在于:new用于单个对象的分配与构造,delete用于其释放;new[]用于对象数组的分配,会调用多个构造函数并存储元素数量,必须用delete[]释放以正确调用每个对象的析构函数并释放内存。若用delete释放new[]分配的数组,将导致未定义行为,可能引发内存泄漏、堆损坏或程序崩溃。现代C++推荐使用std::vector或std::unique_ptr<T[]>、std::shared_ptr<T[]>等智能指针管理动态数组,遵循RAII原则,避免手动内存管理风险。
![c++中new一个数组为什么要用delete[]来释放](https://img.php.cn/upload/article/000/969/633/175659966223694.png)
在C++中,当你使用
new[]
delete[]
delete
当我们用
new T[N]
delete[]
当执行
delete[] ptr
ptr
而如果你错误地使用了
delete ptr
new[]
ptr
int
立即学习“C++免费学习笔记(深入)”;
new
new[]
从表面上看,
new
new[]
首先,
new T
T*
delete ptr
new
delete
而
new T[N]
T*
new[]
delete[] ptr
delete[]
所以,核心区别在于:
new
new[]
delete
new[]
这绝对是一个危险的操作,结果是未定义行为(Undefined Behavior, UB)。在C++中,一旦触发未定义行为,就意味着程序可能做任何事情:它可能看似正常运行一段时间,然后突然崩溃;它可能产生错误的结果;它甚至可能在不同的运行环境或编译器版本下表现出完全不同的行为。你无法预测,也无法依赖其结果。
具体来说,当你用
delete ptr
new T[N]
内存泄漏(Memory Leak):这是最常见的结果。如果T是一个具有非平凡析构函数的类(即它的析构函数有实际的清理工作,比如释放内部资源),那么
delete ptr
ptr
new
int
堆损坏(Heap Corruption):这是更严重的问题。
new[]
delete[]
delete
delete
new[]
delete
程序崩溃(Program Crash):堆损坏通常会导致程序在后续的内存操作中立即或稍后崩溃,表现为段错误(segmentation fault)或其他访问冲突。这种崩溃可能发生在与
delete
总之,用
delete
new[]
new[]/delete[]
在现代C++编程中,我们强烈建议尽可能避免直接使用原始的
new[]
delete[]
std::vector<T>
std::vector
vector
vector
push_back
pop_back
at
size
empty
std::vector
优点:自动内存管理,无需手动
delete[]
at()
示例:
#include <vector>
#include <string>
std::vector<std::string> names; // 创建一个空的字符串向量
names.push_back("Alice");
names.push_back("Bob");
// ... 当names超出作用域时,所有字符串对象都会被正确析构,内存也会被释放。智能指针管理动态数组:
std::unique_ptr<T[]>
std::unique_ptr<T[]>
unique_ptr
优点:独占所有权,避免悬空指针;自动调用
delete[]
示例:
#include <memory>
#include <iostream>
// 创建一个包含5个int的数组
std::unique_ptr<int[]> arr = std::make_unique<int[]>(5);
for (int i = 0; i < 5; ++i) {
    arr[i] = i * 10;
}
// ... 当arr超出作用域时,delete[]会被自动调用。std::shared_ptr<T[]>
std::shared_ptr<T[]>
shared_ptr
优点:共享所有权;自动调用
delete[]
示例:
#include <memory> #include <iostream> std::shared_ptr<double[]> shared_arr(new double[10]); // 需要使用裸new[]作为参数 // 或者更现代的方式,但make_shared不支持数组版本,所以通常是这样 // std::shared_ptr<double[]> shared_arr = std::make_shared<double[]>(10); // C++20开始支持 // ... shared_arr可以被复制,只有当最后一个shared_ptr销毁时,内存才会被释放。
虽然
new[]/delete[]
std::vector
以上就是C++中new一个数组为什么要用delete[]来释放的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号