C++ 动态内存管理:new 与 delete 专家级实战指南
C++ 动态内存管理:new 与 delete 专家级实战指南
本指南通过真实案例详解 C++ 堆内存分配与释放,涵盖 new/delete、new[]/delete[]、对象动态创建及智能指针现代替代方案。
C++ 赋予开发者运行时分配内存的能力——即动态内存分配。与 Java、Python 等托管语言不同,C++ 不自动回收堆内存,程序员必须显式释放。
new 与 delete 运算符是手动内存管理的基石,定义于 C++ 标准库。
new 运算符
new 在堆上分配内存块,返回指向首字节的指针:
// 声明 int 指针
int* pointVar;
// 动态分配一个 int
pointVar = new int;
// 给分配的内存赋值
*pointVar = 45;
pointVar 接收新分配 int 的地址。因 new 返回指针,变量必须是指针类型。数组分配返回指向首元素的指针:
int* arr = new int[10]; // arr 指向包含 10 个 int 的数组首元素
通用语法:
pointerVariable = new DataType; // 单个对象
pointerVariable = new DataType[Size]; // 数组
delete 运算符
不再需要 new 分配的内存时,必须调用 delete 归还操作系统,否则会导致内存泄漏,引发性能下降或崩溃。
单个对象:
delete pointerVariable;
数组(配合 new[]):
delete[] pointerVariable;
完整生命周期示例:
// 分配 int
int* pointVar = new int;
*pointVar = 45;
cout << *pointVar; // 输出: 45
// 释放
delete pointVar;
提示: 每个 new 必须配对 delete(数组用 delete[])。生产代码中应优先使用 RAII 或智能指针(如 std::unique_ptr)自动管理生命周期。
示例 1:基本动态分配
#include <iostream>
using namespace std;
int main() {
int* pointInt;
float* pointFloat;
pointInt = new int;
pointFloat = new float;
*pointInt = 45;
*pointFloat = 45.45f;
cout << *pointInt << endl;
cout << *pointFloat << endl;
delete pointInt;
delete pointFloat;
return 0;
}
输出
45 45.45
演示了两个基本类型的分配、赋值、输出与释放全流程。
注意: 当数组大小运行时才确定时,动态分配极具灵活性优势。
示例 2:动态分配浮点数组
#include <iostream>
using namespace std;
int main() {
int num;
cout << "Enter total number of students: ";
cin >> num;
float* ptr = new float[num];
cout << "Enter GPA of students." << endl;
for (int i = 0; i < num; ++i) {
cout << "Student" << i + 1 << ": ";
cin >> *(ptr + i);
}
cout << "\nDisplaying GPA of students." << endl;
for (int i = 0; i < num; ++i) {
cout << "Student" << i + 1 << " :" << *(ptr + i) << endl;
}
delete[] ptr; // 必须用 delete[] 释放数组
return 0;
}
输出
Enter total number of students: 4 Enter GPA of students. Student1: 3.6 Student2: 3.1 Student3: 3.9 Student4: 2.9 Displaying GPA of students. Student1 :3.6 Student2 :3.1 Student3 :3.9 Student4 :2.9
程序根据用户输入的学生数动态分配数组,录入数据、显示,最后用 delete[] 释放内存。
示例 3:动态分配对象
#include <iostream>
using namespace std;
class Student {
int age;
public:
Student() : age(12) {}
void getAge() {
cout << "Age = " << age << endl;
}
};
int main() {
Student* ptr = new Student();
ptr->getAge();
delete ptr;
return 0;
}
输出
Age = 12
在堆上创建 Student 对象,构造函数初始化 age 为 12,调用 getAge 打印,最后 delete 释放对象内存。
现代 C++ 最佳实践
- 优先使用
std::unique_ptr/std::shared_ptr管理动态内存,自动异常安全释放。 - 避免裸
new/delete,除非编写底层库或性能极度敏感代码。 - 容器(
std::vector、std::string)已内置动态内存管理,优先使用容器而非手动数组。
C语言
- GE Digital发布预测性资产管理软件,推动维护从反应式转向主动式
- 树莓派 3 B+ – 更新特性、规格与选购指南
- Wittmann Battenfeld 推出 X 系列高端机器人与 Primus 14 经济型机型
- 数字存储器基础:寻址、访问与易失性
- C++结构体与类:嵌入式开发者实战指南
- 掌握 C++ 变量、字面量与常量:核心概念与实战指南
- C++类与对象:面向对象编程实战指南
- C++ 三种继承方式深度解析:public、protected 与 private
- C++ 友元函数与友元类:突破访问控制的利器
- C 语言动态内存管理:calloc、malloc 与 free 完全解析
- C++日期时间完全指南:ctime库、tm结构体与格式化输出
- 精通 Python 目录与文件操作