只是调用deleteLater()足以避免Javascript with Embind中的内存泄漏?

时间:2017-03-08 19:02:19

标签: javascript c++ memory-leaks

我是一位长期的Java / C ++程序员和新手Javascript程序员。我试图使用我以前用C ++编写的类创建一个Web应用程序。

在我的Javascript网络应用中,我使用Embind创建和使用最初用C ++编码的类。在Embind文档页面上,它说,

  

JavaScript代码必须显式删除它收到的任何C ++对象句柄,否则Emscripten堆将无限增长。

并且页面上的示例显示创建的对象在使用后立即被删除:

  

var x = new Module.MyClass;   x.method();   x.delete();

在我的网络应用程序中,我希望C ++中的对象在网页的生命周期内保持不变。我希望能够按下页面上的按钮并更新我的对象的状态。如果我.delete()脚本末尾的对象,当我稍后尝试按下按钮时,它将不会持续存在。

在Embind示例embind.test.js中,可以在新创建的对象上调用.deleteLater():

  

var v =(new cm.ValHolder({}))。deleteLater();

我的问题是,如果我只是在创建对象时调用.deleteLater(),这是否足以在应用程序运行完毕或页面关闭时删除对象?我试图避免无限期地增加堆或导致任何内存泄漏。

同样,我是Javascript的新手,所以请指出我是否遗漏了任何明显的内容,或者是否对Javascript内存泄漏和指针的最佳做法一无所知。

如果我需要澄清任何事情,请告诉我。谢谢!

参考:https://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/embind.html#memory-management

1 个答案:

答案 0 :(得分:0)

我在同一条道路上,确实没有适合您的具体答案,但是作为JS开发人员,我可以与此合作:

  • 在已删除的对象上调用delete()会引发一个丑陋的异常(无法从JS捕获)。有一个未记录的方法可以检查此内容:obj.isDeleted()。当对象被“删除”时,obj.SS.count也将为0
  • 在浏览器中,不删除对象肯定会破坏您的应用程序,但是从C ++开发人员的角度来看,这仅在文档的上下文中发生-因此,只需重新加载页面-您就可以收回所有内存(不需要杀死浏览器)
  • 从C ++代码引发异常(例如sigint,错误的内存分配等)时,即使使用DISABLE_EXCEPTION_CATCHING或其他调试标志,也似乎无法捕获它们。 Module.onAbort或类似文件也不会处理它们。因此,如果有人在程序抛出时处理deleteLater()注册的对象,则必须在C ++端。
  • 我看到没有关于delete(),isDeleted()deleteLater()的文档,我认为这些文档很适合成为PR。