Мои данные исчезают при передаче буфера в NodeJS из C++

У меня следующая ситуация, которую я не понимаю. У меня есть приложение, где из 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(),

Мои вопросы

Я хотел бы получить объяснение того, что происходит, и в идеале получить потенциальное решение.

2 ответа

Решение

Я думаю, что проблема в том, что char str[80]; будет выделен в стеке и как только ваш Combine Метод завершен, он будет освобожден (извлечен из стека) и перезаписан другими вещами, которые помещаются в стек.

Объявите это как char* str; и распределить его динамически с str = new char[80];, Затем выполните все эти инициализации с помощью strcpy и strcat.

Согласно документации, NewBuffer предполагает, что владение данными передается в сам буфер.
Ваш массив символов вообще не копируется, он исчезает, когда выходит из строя, если его область действия и, таким образом, вы попадаете в неопределенное поведение.
Вы должны скорее разместить массив в динамической памяти и позволить буферу взять на себя владение им для решения проблемы.
Другими словами, используйте new оператор, чтобы выделить массив символов, передать его NewBuffer и не удаляйте его.

Другие вопросы по тегам