以下代码段在将节点从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
获得相同的行为答案 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());