从 C++ 将缓冲区传递给 NodeJS 时,我的数据消失了

My data disappears when passing buffer to NodeJS from C++

我有以下情况不明白。我有一个应用程序,我从 NodeJS 中使用 Nan 调用 C++ 函数。 C++端代码如下:

#include <nan.h>
#include <iostream>

using namespace std;
using namespace Nan;
using namespace v8;

//
//  The function that we are going to call from NodeJS
//
NAN_METHOD(Combine)
{
    char str[80];

    strcpy (str,"these ");
    strcat (str,"strings ");
    strcat (str,"are ");
    strcat (str,"concatenated.");

    //
    //  Send the buffer back to NodeJS with the result of our calculation.
    //
    info
    .GetReturnValue()
    .Set(
        NewBuffer((char *) str, 80)
    .ToLocalChecked());
}

//
//  The constructor
//
NAN_MODULE_INIT(Init)
{
    //
    //  Expose the method or methods to NodeJS
    //
    Nan::Set(
        target,
        New<String>("combine").ToLocalChecked(),
        GetFunction(New<FunctionTemplate>(Combine)).ToLocalChecked()
    );
}

//
//  Load the constructor
//
NODE_MODULE(basic_nan, Init)

当我将我的 char 变量发送回 NodeJS 时,我得到了 80 个字节,但它们充满了随机值。看起来 str 变量指向的地方在创建 NewBuffer().

之前被回收了

我的问题

我想得到关于正在发生的事情的解释,最好能得到一个潜在的解决方案。

根据documentationNewBuffer假设数据的所有权转移到缓冲区本身。
您的 char 数组根本没有被复制,如果它的作用域消失,它 就会消失 ,因此您会出现未定义的行为。
您应该宁愿在动态内存上分配数组并让缓冲区获取它的所有权来解决问题。
换句话说,使用 new 运算符分配字符数组,将其传递给 NewBuffer 并且 不要删除它 .

我认为问题是 char str[80]; 将在堆栈中分配,一旦您的 Combine 方法完成,它将被释放(从堆栈中弹出)并被其他获得的东西覆盖压入堆栈。

声明为char* str;并用str = new char[80];动态分配。然后使用 strcpy 和 strcat 进行所有这些初始化。