题目
动态内存分配与释放
信息
- 类型:问答
- 难度:⭐
考点
动态内存分配,内存释放,内存泄漏
快速回答
以下代码存在内存泄漏问题:
- 使用
new分配内存后未调用delete释放 - 程序退出时未回收堆内存
修正方法:
- 在指针不再使用时添加
delete ptr; - 释放后建议将指针置为
nullptr
问题代码分析
#include <iostream>
using namespace std;
int main() {
int* ptr = new int(10); // 动态分配内存
cout << *ptr << endl; // 使用指针
// ... 其他代码
return 0; // 退出前未释放内存
}原理说明
C++中动态内存管理遵循谁分配谁释放原则:
new操作符在堆(heap)上分配内存- 分配的内存不会自动回收,必须显式调用
delete - 未释放的内存会导致内存泄漏,程序长时间运行可能耗尽内存
修正代码示例
#include <iostream>
using namespace std;
int main() {
int* ptr = new int(10); // 分配
cout << *ptr << endl;
delete ptr; // 关键修正:释放内存
ptr = nullptr; // 最佳实践:防止野指针
return 0;
}最佳实践
- 配对使用:每个
new必须有对应的delete - 及时释放:内存不再使用时立即释放
- 置空指针:释放后设置
ptr=nullptr避免野指针 - 优先使用智能指针:C++11+推荐
unique_ptr/shared_ptr自动管理内存
常见错误
- ❌ 忘记
delete(本题核心错误) - ❌ 重复释放:对同一指针多次
delete导致崩溃 - ❌ 访问已释放内存:释放后未置空导致野指针
扩展知识
- 作用域局限:动态内存的生命周期不受作用域限制
- RAII原则:资源获取即初始化,智能指针基于此实现
- 内存泄漏检测工具:Valgrind(linux)/Dr.Memory(windows)可检测泄漏
- 替代方案:小型对象优先使用栈内存(自动管理)