在c ++和nodejs之间传递数据

时间:2017-12-14 11:30:06

标签: c++ node.js v8 node-modules

以下代码段在将节点从v0.12升级到v6.11

后导致发出
vector<char> buf;
// code that populates the vector

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size());

//return buffer to node    
args.GetReturnValue().Set(scope.Escape(nbuf));

节点升级意味着必须更改:

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size());

为:

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size()).ToLocalChecked());

问题是当在节点中打印出缓冲区的内容时,内容不一样。 所以问题是:当使用节点v6.11时,如何获得与节点v0.12中相同的行为?

更新:经过一些研究后我发现了潜在的问题 - 缓冲区:新调用ArrayBuffer :: New,它在现有的内存缓冲区之上构建了一个arrayBuffer,所以当它超出范围时,缓冲区只包含堆栈中的内容。在node-v0.12 Buffer:New正在创建它拥有的数据的副本。 问题是我仍然不知道如何使用node-v6

获得相同的行为

2 个答案:

答案 0 :(得分:0)

您的ToLocalChecked()出错了。正确的是:

Local<Object> nbuf = Buffer::New(args.GetIsolate(), &buf[0], buf.size()).ToLocalChecked();

答案 1 :(得分:0)

张贴此内容以防万一有人遇到同样的问题:

问题是节点0.12和节点v6之间的Buffer :: New(...)

的实现
MaybeLocal<Object> New(Isolate* isolate, const char* data, size_t length)

已更改:在节点0.12中,它用于调用memcpy,而节点v6只调用ArrayBuffer::New(env->isolate(), data, length),这不会复制数据。根据文件:

  

static Local v8 :: ArrayBuffer :: New(Isolate * isolate,   void * data,size_t byte_length)

     

在。上创建一个新的ArrayBuffer   现有的内存块。创建的数组缓冲区立即进入   外化状态。当a时,内存块不会被回收   创建的ArrayBuffer被垃圾收集。

所以ArrayBuffer建立在本地创建的向量之上,超出了你在堆栈中剩余的范围......这就是我所看到的。

解决方案:致电Buffer::Copy(args.GetIsolate(), &buf[0], buf.size());