[其他ST产品] “new”和“delete”操作符在默认情况下是如何实现的

[复制链接]
 楼主| 内核558 发表于 2025-6-11 09:00 | 显示全部楼层 |阅读模式
正在将C++应用程序移植到STM 32设备上。应用程序本身正长运行,但我观察到堆内存增长到堆栈中,并在一段时间后引发异常。
在Visual Studio中运行Windows上的应用程序显示了相同的现象,所使用的内存只会增加,但不会崩溃。这可能是因为有GB的RAM而不是KB ;)
我怀疑该应用程序有内存泄漏,貌似缺少了一些编译器设置或类似的东西,我看过一些关于嵌入式设备上的C++的文章,他们建议使用malloc()和free()来覆盖new和delete操作符。如果我这样做,还需说明请求和释放了多少内存。
但是我想知道new和delete操作符的是如何实现的,以检查它们是如何工作的。

公羊子丹 发表于 2025-7-31 15:43 | 显示全部楼层
new 和 delete 本质上就是对 malloc 和 free 的封装,只是加了构造和析构调用,ST 的环境下也是这样。
周半梅 发表于 2025-7-31 15:48 | 显示全部楼层
在嵌入式环境里,默认的 new 用的是 C 库的 malloc,如果没实现 _sbrk 就会跑飞。
帛灿灿 发表于 2025-7-31 15:49 | 显示全部楼层
如果你用的是 newlib nano,那 new 分配的堆来自 _sbrk,可以加 log 打印分配情况。
童雨竹 发表于 2025-7-31 15:50 | 显示全部楼层
我项目里直接重载了 operator new 和 delete,用的是自己写的内存池,更好调控碎片问题。
万图 发表于 2025-7-31 15:51 | 显示全部楼层
嵌入式设备上的内存泄漏太致命了,我建议加上静态分析工具,比如 cppcheck + valgrind 模拟测试。
Wordsworth 发表于 2025-7-31 15:52 | 显示全部楼层
如果你担心泄漏又想继续用 C++,可以考虑用 std::unique_ptr 或 std::array 替代裸指针。
Bblythe 发表于 2025-7-31 15:52 | 显示全部楼层
Visual Studio 能跑不代表能上板,嵌入式上你得看 map 文件实时观察 .heap 和 .stack 占用增长。
Pulitzer 发表于 2025-7-31 15:53 | 显示全部楼层
重载 global new/delete 时你可以加统计变量,每次分配/释放都打 log,哪块没 free 一目了然。
Uriah 发表于 2025-7-31 15:54 | 显示全部楼层
有些系统建议关闭 exception 支持,new 失败时直接返回 null,别默认走 std::terminate()。
Clyde011 发表于 2025-7-31 15:55 | 显示全部楼层
你项目如果长期运行,建议用固定块内存管理,不然哪怕不泄漏,长期碎片也可能让 new 失败。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

38

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

38

主题

38

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部