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