【发布时间】:2015-06-22 01:24:28
【问题描述】:
众所周知,抛出std::bad_malloc 的常见原因是内存耗尽。
我正在执行一个嵌入式裸机(无操作系统)应用程序。初始分配有时会成功,有时会失败。由于没有其他代码在运行(没有操作系统,没有其他进程),我有充分的理由相信这个std::bad_alloc 比分配比系统可用的更多内存更复杂。当它工作时,分配了大约 500kB 的内存。硬件已分配 16MB。
相反,系统似乎对分配了多少内存有错误的记录,特别是当分配器开始时,它认为已经分配了一些非零的内存量。
当裸机应用程序启动时,它应该分配相同的零内存。这里好像不是这样的。
内存分配器中的某些状态是否可能在软重置之间保留?我怎样才能知道分配是如何完成的?
这是在带有 gcc (Sourcery CodeBench Lite 2013.05-40) 4.7.3 的 ARMv7 上运行的,并链接到 libstdc++6.0。我们正在使用-O0 -g 进行编译。
我们使用 new 关键字和标准分配器分配 std:: 对象和用户定义的对象。
【问题讨论】:
-
它是特定于实现的。因此,编辑您的问题以通过提供更多信息来改进它(哪个编译器和版本,哪个
libstdc++和版本,::operator new是如何实现的,您如何 - 使用哪些优化 - 您正在编译等等......)。跨度> -
即使是编辑也不够说明问题。内存分配器实际上是如何完成的?
-
这完全取决于您(和您的库)是初始化变量,还是依靠上电复位来为它们提供预期值。软重置不会将所有内容恢复为开机默认设置。
-
对,那我要如何找出这些东西呢?我将编辑问题...
-
libstdc++ 使用标准 C 库 (malloc/free) 的内存分配服务;所以我们需要知道使用的是什么 C 库——默认的 glibc 需要 POSIX 环境,所以在裸机系统上你很可能使用替代方案。
标签: c++ memory memory-management embedded dynamic-memory-allocation