在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,一定要严格遵循匹配规则,分配后及时释放,释放后重置指针,避免各类内存相关问题。