gpt4 book ai didi

javascript - 仅调用 deleteLater() 是否足以避免使用 Embind 的 Javascript 中的内存泄漏?

转载 作者:太空狗 更新时间:2023-10-29 23:12:56 26 4
gpt4 key购买 nike

我是一名资深 Java/C++ 程序员和新手 Javascript 程序员。我正在尝试使用我之前用 C++ 编写的类制作一个网络应用程序。

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

JavaScript code must explicitly delete any C++ object handles it has received, or the Emscripten heap will grow indefinitely.

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

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

最佳答案

我在同一条路上,真的没有具体的答案给你,但作为一名 JS 开发人员,我可以与这个合作:

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

关于javascript - 仅调用 deleteLater() 是否足以避免使用 Embind 的 Javascript 中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42679759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com