您是否知道是否有办法将malloc恢复到初始状态,就像程序刚刚启动一样?
原因:我正在使用nintendods devkitpro开发嵌入式应用程序,我希望能够在出现软件故障时改进调试支持。我已经可以捕获大多数错误,例如返回控制台菜单,但在捕获std :: bad_alloc时无法正常工作。
我怀疑我用于“软重启”的代码涉及malloc()本身在某些时候我无法控制,所以我想“忘记正在运行的应用程序的一切并重新开始”。
答案 0 :(得分:3)
没有办法以可移植的方式进行此操作,尽管C ++的嵌入式实现可能会将其作为扩展提供。您应该考虑编写自己的分配系统,使用内存池或使用现有库。
答案 1 :(得分:2)
只有我做了类似的事情,我们使用自己的分配器来保持对每个分配块的引用。如果我们想要回滚,我们将释放所有已分配的块并执行longjmp以重新启动程序。
答案 2 :(得分:2)
在全球范围内松散一点记忆,例如
int* not_used = new i[1024];
然后当你得到std::bad_alloc
时,删除not_used并转到错误控制台。我们的想法是为您的崩溃处理程序提供足够的空间来满足您的需求。您必须调整保留的内存量,以便您的控制台不会收到内存不足错误。
如果你很聪明,实际上可以使用not_used。但是你必须要小心,任何使用内存的东西都可以删除,恕不另行通知。
答案 3 :(得分:1)
我想如果没有其他东西在运行,你可以零编写API在Nintendo上提供的整个内存块吗?但是否则只是跟踪你的分配。
实际上,如果你创建一个CatchAndRelease
类来保持对每个分配的内存块的引用,那么在你需要的时候你可以返回并清除它们。
否则,您可能需要编写自己的内存池,如Neil所述。
答案 4 :(得分:1)
重新开始的唯一方法是从存储中重新加载应用程序。 DS将所有内容加载到RAM中,这意味着数据部分已就地修改。
答案 5 :(得分:1)
除了先进先出顺序以外,您是否需要释放内存?如果没有,我建议您定义一个数组以使用所有可用内存(您可能必须调整链接器文件来执行此操作),然后初始化指向该数组开头的指针。然后编写自己的malloc()函数:
char *allocation_ptr = big_array; void *malloc(size_t n) { void *temp = (void*)allocation_ptr; if (allocation_ptr > END_OF_ALLOCATION_AREA - n) return 0; allocation_ptr += n; return temp; } void free_all_after(void *ptr) { if (ptr) allocation_ptr = (char*)ptr; }
在此实现中,free_all_after()将释放指示的指针以及在其后分配的所有内容。请注意,与malloc()的其他实现不同,此实现具有零开销。 LIFO的分配是非常有限的,但对于许多嵌入式系统来说,它是完全足够的。
答案 6 :(得分:0)
std :: bad_alloc。这通常会在堆内存不足时发生,因此无法满足请求。因此,您将无法在清理中可靠地分配任何新内存。
这意味着您可能无法为清理分配新内存。您成功清理的唯一希望是确保在实际需要之前预先分配清理代码的内存。
使用inplace new运算符(即提供内存地址的新运算符)仍然可以将对象新建到此清理内存中