第2课_内存管理
热度🔥:81 免费课程
授课语音
C++中的内存管理
在C++中,内存管理是一个核心且重要的话题。有效地管理内存不仅能够提高程序性能,还能避免潜在的内存泄漏问题。C++提供了动态内存分配和释放的操作符,如new
和delete
,用于在运行时动态分配和释放内存。
1. 动态内存分配
C++允许在程序运行时动态分配内存。动态内存分配使用new
操作符。它会在堆(Heap)中分配指定大小的内存,并返回指向该内存的指针。
语法:
T* ptr = new T; // 为单个对象分配内存
T* arr = new T[n]; // 为数组分配内存
2. 释放动态内存
使用delete
或delete[]
操作符可以释放动态分配的内存,以防止内存泄漏。
语法:
delete ptr; // 释放单个对象的内存
delete[] arr; // 释放数组的内存
注意:释放内存后,建议将指针设置为nullptr
,以避免悬空指针问题。
3. 示例代码:单个对象的动态内存分配和释放
#include <iostream>
int main() {
// 使用 new 分配内存
int* ptr = new int; // 动态分配一个整数
*ptr = 42; // 给动态分配的内存赋值
// 打印分配的值
std::cout << "值: " << *ptr << std::endl;
// 使用 delete 释放内存
delete ptr;
// 避免悬空指针
ptr = nullptr;
return 0;
}
/*
程序解释:
1. 使用 new 在堆中分配一个整数的内存,并返回其地址。
2. 将值 42 存储到动态分配的内存中。
3. 使用 delete 释放内存,防止内存泄漏。
4. 将 ptr 设置为 nullptr,避免指向非法地址。
*/
4. 示例代码:动态数组的分配和释放
#include <iostream>
int main() {
int n = 5; // 动态分配数组大小
int* arr = new int[n]; // 分配动态数组
// 初始化数组
for (int i = 0; i < n; ++i) {
arr[i] = i + 1; // 将值 1, 2, 3, 4, 5 赋给数组
}
// 打印数组内容
std::cout << "数组内容: ";
for (int i = 0; i < n; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 使用 delete[] 释放数组内存
delete[] arr;
// 避免悬空指针
arr = nullptr;
return 0;
}
/*
程序解释:
1. 使用 new 分配动态数组,大小为 n。
2. 初始化数组元素。
3. 使用 delete[] 释放数组内存。
4. 将 arr 设置为 nullptr 避免潜在问题。
*/
5. 注意事项
- 每次使用
new
分配的内存都需要使用delete
或delete[]
来释放。 - 不释放动态内存会导致内存泄漏。
- 多次释放同一块内存会引发未定义行为。
- 在现代C++中,可以考虑使用智能指针(如
std::unique_ptr
和std::shared_ptr
)来自动管理内存,减少手动释放的风险。
通过掌握new
和delete
的使用,以及良好的编程习惯,可以更高效地管理C++程序中的内存。