使用 N-API 时如何避免分段错误?

How to avoid Segmentation fault when using N-API?

我正在尝试使用节点插件 api (N-NAPI) 构建 node-js wrapper for the C++ library Clip。我想从用户的剪贴板中检索图像并将其传递到 node.js 缓冲区中的 JavaScript。

这是我试过的:(只有相关部分,其余部分here

Napi::Object get_image(const Napi::CallbackInfo& args) {
  Napi::Env env = args.Env();

  clip::image img;
  clip::get_image(img);

  clip::image_spec spec = img.spec();

  char *pixels = img.data();
  // since I dont know the length of pixels I use the width * height of the image
  Napi::Buffer<char> img_buffer = Napi::Buffer<char>::New(env, pixels, spec.width * spec.height);
  return img_buffer;
}

这编译得很好,但是当我尝试在 JavaScript 中使用它时,结果是 Segmentation fault (core dumped).

示例JS代码:

const clip = require('bindings')('node_clip_wrapper')
console.log(clip.getImage())

我该如何解决这个问题?如果我遗漏了一些基本的东西,请原谅,我是 C++ 和构建节点插件的新手。

解决方案是使用 Napi::Buffer::Copy 而不是 NewDocumentation

就像这样:

Napi::Buffer<char> img_buffer = Napi::Buffer<char>::Copy(env, pixels, spec.width * spec.height);

我认为 Napi::Buffer::Copy 不是一个好的解决方案,因为复制基础数据的成本很高。

Napi::Buffer::New 只要您保持内存有效,JavaScript 代码就可以工作,直到 Buffer 对象完成。在您的情况下,pixels 指向的数据在函数 returns.

后被取消分配

你也可以使用外部缓冲区API来自己管理内存: https://nodejs.org/api/n-api.html#napi_create_external_arraybuffer