24人参与 • 2026-01-23 • C/C++
c++ 的动态内存管理(通过 new/delete 或 new[]/delete[])是强大但危险的功能。如果使用不当,会导致严重的运行时错误、内存泄漏、安全漏洞甚至程序崩溃。下面列出实际项目中最常见的动态内存问题,按严重性和出现频率排序,并附带原因、后果和示例。
delete,或在异常/提前返回时未释放。示例:
void bad() {
int* p = new int[1000];
return; // 忘记 delete[] p → 泄漏
}
示例:
int* p1 = new int; int* p2 = p1; delete p1; delete p2; // 双删 → 崩溃
示例:
int* p = new int(42); delete p; std::cout << *p; // 使用已释放内存 → 未定义行为
new 分配却用 delete[] 释放,或反之。new[] 分配,必须用 delete[] 释放。示例:
int* arr = new int[10]; delete arr; // 错误!应该 delete[] arr int* p = new int; delete[] p; // 错误!应该 delete p
new 默认不初始化(除非用 ())。示例:
int* p = new int; // 值是未定义的 std::cout << *p; // 垃圾值 int* p2 = new int(); // 正确:初始化为0
示例:
int* arr = new int[5]; arr[10] = 42; // 越界写 → 未定义行为
示例:
void bad() {
int* p = new int;
some_function_that_throws(); // 异常 → p 未 delete
}
现代 c++(c++11 及以后)强烈建议避免裸指针(raw pointers)手动管理动态内存,改用以下方式:
| 问题类型 | 推荐解决方案 | 原因 |
|---|---|---|
| 所有手动管理问题 | 智能指针:std::unique_ptr、std::shared_ptr、std::weak_ptr | 自动释放,raii 原则 |
| 容器内存管理 | 标准容器:std::vector、std::string、std::map 等 | 自动管理内存,无需 new/delete |
| 异常安全 | raii + 智能指针/容器 | 异常时自动析构释放资源 |
| 越界访问 | std::vector::at() 或 gsl::span | 提供边界检查(调试模式) |
示例:正确做法
#include <memory>
#include <vector>
void good() {
auto p = std::make_unique<int>(42); // unique_ptr 自动释放
std::vector<int> vec(1000); // 自动管理内存
vec[0] = 10; // 安全访问
} // 离开作用域自动释放所有资源
总结:在现代 c++ 项目中,几乎不应该出现裸 new/delete(除极少数性能极致场景)。一旦看到代码里有大量 new/delete,就大概率存在潜在内存问题。使用智能指针和标准容器,能彻底避免上述 90% 以上的动态内存问题。
到此这篇关于浅谈c++ 中的常见的动态内存问题的文章就介绍到这了,更多相关c++ 动态内存问题内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论