在Pebble中,exit()上的free()内存是否真的必要?

时间:2016-08-21 17:12:18

标签: c pebble-watch pebble-sdk

More C ConceptsGoogle webcache,而非Internet存档)中,我读了以下内容:

  

当应用程序退出或不再需要缓冲区时,将释放内存 以供应用程序使用:

// Free dynamically allocated memory
free(s_buffer);

Learning C for the Pebble SDKInternet Archive)中,我读到了:

  

与其他语言(如Python或JavaScript)不同,C语言依赖开发人员来管理他们使用的任何内存。这意味着开发人员可以再次释放由程序分配的用于存储数据的任何内存,以便其他程序可以使用它。

我习惯于在非嵌入式场景中编程,其中每个应用程序都有自己的地址空间,并且在进程终止时,OS会回收分配的内存。但是,Pebble SDK中的上述两个声明表明,如果我调用malloc()然后程序退出或在调用free()之前被杀死,则手表将无法回收内存。它还显示了在事件循环退出后取消初始化窗口等的示例

我真的希望如果我需要在启动时动态计算一次缓冲区大小,我可以不用担心在进程退出之前清理它。当然,对于具有短于进程生命周期的事物,我需要跟踪这些事情并清理它们以避免泄漏并导致我的应用程序内存不足。但是尝试为所有内容执行此操作 - 更确切地说,以确保free()*_deinit()被调用的方式,即使程序不正确地终止 - 这似乎都是浪费时间和不可能。

如何安全地编写Pebble Watch应用程序,以便在应用程序被杀死时,所有分配的内存都会被释放?或者Pebble的操作系统是否会像现代操作系统那样终止并清理应用程序分配的资源?

1 个答案:

答案 0 :(得分:3)

答案似乎是:

  • 是的,如果你的应用程序退出,无论是通过杀戮还是正常退出,一切都会被清理干净
  • 确保0B报告为退出时仍然分配是一种良好的做法,因为它有助于防止内存泄漏。

正如您所见,官方文档对此主题几乎完全保持沉默,因此,如果没有Pebble开发者的声明,我们将无法获得明确的答案。我们有几个选择可以接近:第一个是转向Pebble论坛:

我们还可以查看最可靠的来源,Reddit的/r/pebbledevelopers,他们声称:

我们也可以查看this set of slides,特别是:

Size of Aplite stack

(我相信这只适用于Aplite,a.k.a。Pebble 1.O)

这表明没有多少app" headroom" - 如果一个应用程序或应用程序开始泄漏并且没有被操作系统完全清理,很快就无法启动新的应用程序。

总之:我不会过分担心它。