当从c++传递缓冲区到NodeJS时,我的数据消失了



我有以下情况,我不明白。我有一个应用程序,从NodeJS我调用一个c++函数使用Nan。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)

当我发送回NodeJS我的char变量时,我得到80字节,但它们充满了随机值。看起来好像str变量所指向的位置在创建NewBuffer()之前被回收了。

<标题>我的问题

我想得到一个解释是怎么回事,最好得到一个潜在的解决方案🙂.

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

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

根据文档,NewBuffer假设数据的所有权转移到缓冲区本身。
你的字符数组根本不被复制,它消失当它超出它的作用域,因此你在一个未定义的行为。
你应该在动态内存中分配数组,让缓冲区拥有它来解决这个问题。
换句话说,使用new操作符分配字符数组,将其传递给NewBuffer,并且不删除它

相关内容

  • 没有找到相关文章

最新更新