您是否知道是否有一种方法可以使 malloc 恢复到初始状态,就像程序刚刚启动一样?

原因 :我正在使用 nintendos devkitpro 开发嵌入式应用程序,我希望能够改进软件故障时的调试支持。我已经可以捕获大多数错误,例如返回到控制台菜单,但这在捕获 std::bad_alloc 时不起作用。

我怀疑我用于“软重启”的代码在某些时候涉及 malloc() 本身,我无法控制,所以我想“忘记正在运行的应用程序的所有内容并重新开始”。

有帮助吗?

解决方案

以获得一个新的开始的唯一方法是重新加载从存储的应用程序。的DS加载到一切RAM这意味着该数据部分在适当的位置进行修改。

其他提示

没有可移植这样做的方式,虽然concievably C ++的嵌入式实现可能提供其作为一个扩展。而应该看看编写自己的分配系统,采用内存池,或使用现有的库。

只有我没有类似的东西,我们用我们自己的分配器,其将保持参照各分配块的时间。如果我们想回滚,我们将释放所有分配的块,做longjmp的重新启动程序。

松鼠远在一个全球位置e.g比特的存储器。

int* not_used = new i[1024];

然后当你得到一个std::bad_alloc,删除NOT_USED并移动到你的错误控制台。我们的想法是给你的崩溃处理只是足够的空间,你所需要的。你必须调整多少内存保留,以便您的控制台不会也收到了内存不足的错误。

如果你聪明,NOT_USED实际上可以使用。但是你必须要小心,无论是使用的内存可能会被直接删除。

我想如果没有其他东西在运行,你可以对任天堂上提供的 API 的整个内存块进行零写入吗?但除此之外,只需跟踪您的分配即可。

事实上,如果您创建一个 CatchAndRelease 类来保留对每个分配的内存块的引用,在需要的时候您可以返回并清除它们。

否则,您可能需要编写自己的内存池,正如 Neil 提到的。

你是否需要免费的内存比后进先出的顺序其他什么吗?如果没有,我建议你定义数组使用所有可用的内存(你可能需要调整链接文件,要做到这一点),然后初始化一个指针数组的开始。然后写自己的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()函数的其他实现方式中,这一个有的开销。后进先出分配非常限制性的,而对于许多嵌入式系统将是完全足够的。

的std ::当新失败,并且不能分配所请求的存储器发生bad_alloc的。当堆已用完的存储器,这将通常发生,因此不能接受该请求。出于这个原因,你将无法在清理可靠分配的新内存。

这意味着你可以不进行清理分配新的内存。你唯一成功清理的希望是保证清理代码的内存是预先分配好之前,你真的需要它。

物件仍可newed到使用就地新操作者此清理存储器(即新,你提供的存储器地址)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top