【问题标题】:Garbage Collection of C++ externals [duplicate]C ++外部的垃圾收集[重复]
【发布时间】:2019-01-14 15:55:04
【问题描述】:

我为一些 AI 问题用 C++ 制作了一个 connect-4 游戏,并将其作为插件连接到 nodejs Web 服务器。

我是这样工作的:

  v8::Isolate *isolate = v8::Isolate::GetCurrent();
  Game *game_ptr = new Game();
  game_ptr->nextPlayer();

  Local<ObjectTemplate> game_template = ObjectTemplate::New(isolate);
  game_template->SetInternalFieldCount(1);
  Local<Object> game = game_template->NewInstance();
  game->SetInternalField(0, External::New(isolate, game_ptr));

我的问题是:游戏(被用作v8::External)是垃圾收集还是我应该自己管理内存?

如果我应该管理内存,最佳做法是什么?

【问题讨论】:

  • 将其设为 unique_pointer 即可。否则最后调用 delete。

标签: c++ node.js node.js-addon


【解决方案1】:

c++ 的口号下,只为你使用的东西付费,没有垃圾回收。这意味着您需要自己管理内存。在这种特定情况下,您有 2 个选项:

  1. 不要用new 做游戏。根据您的应用程序,仅使用 Game game; 可能就足够了。
  2. 如果你真的需要newGame,请将新的包装在一个RAII(资源获取是初始化)习语类型中。您可以利用c++ 智能指针:

    auto game_ptr = std::make_unique&lt;Game&gt;();

    unique_ptr的作用域结束时,它所包含的内存将被自动释放。

【讨论】:

  • (这个问题是在 Node.js 的上下文中,这是一个 GC 环境。尽管如此,v8 不会释放 Externals 中包装的内存。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
相关资源
最近更新 更多