it编程 > 编程语言 > C/C++

浅谈C++ 中的常见的动态内存问题

24人参与 2026-01-23 C/C++

c++ 的动态内存管理(通过 new/deletenew[]/delete[])是强大但危险的功能。如果使用不当,会导致严重的运行时错误、内存泄漏、安全漏洞甚至程序崩溃。下面列出实际项目中最常见的动态内存问题,按严重性和出现频率排序,并附带原因、后果和示例。

1.内存泄漏(memory leak)

示例

void bad() {
    int* p = new int[1000];
    return;  // 忘记 delete[] p → 泄漏
}

2.重复释放(double delete / double free)

示例

int* p1 = new int;
int* p2 = p1;
delete p1;
delete p2;  // 双删 → 崩溃

3.释放后使用(use after free)

示例

int* p = new int(42);
delete p;
std::cout << *p;  // 使用已释放内存 → 未定义行为

4.new 和 delete 不匹配(mismatch new/delete)

示例

int* arr = new int[10];
delete arr;     // 错误!应该 delete[] arr

int* p = new int;
delete[] p;     // 错误!应该 delete p

5.未初始化动态内存

示例

int* p = new int;     // 值是未定义的
std::cout << *p;      // 垃圾值
int* p2 = new int();  // 正确:初始化为0

6.越界访问(buffer overflow / out-of-bounds)

示例

int* arr = new int[5];
arr[10] = 42;  // 越界写 → 未定义行为

7.异常安全问题(exception safety)

示例

void bad() {
    int* p = new int;
    some_function_that_throws();  // 异常 → p 未 delete
}

如何避免这些问题(现代 c++ 最佳实践)

现代 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++  动态内存问题内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

C++ auto和decltype的用法和区别全解析

01-22

C++ private、protected、public从入门到精通实例解析

01-23

PyQtGraph中的PlotWidget基本使用和代码示例

01-25

C++ 中同名函数的实现原理与使用(函数重载)

01-21

C++ STL unordered_set 与 unordered_map的基本用法完全指南

01-21

C++动态内存分配的核心机制与最佳实践(从对象生命周期到智能管理)

01-21

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论