2016-10-11 1 views
3

У меня есть следующая ситуация, которую я не понимаю. У меня есть приложение, где из NodeJS я вызываю функцию C++ с помощью Nan. Код на стороне C++ выглядит следующим образом:Мои данные исчезают при передаче буфера в NodeJS из 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 моего переменного полукокса, я получаю 80 байт, но они полны случайных величин. Похоже, что место, где указала переменная str, было исправлено до создания NewBuffer().

Мои вопросы

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

ответ

0

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

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

+0

'malloc'? В самом деле? – skypjack

+0

@skypjack Я предполагал, что он использует C, так как я видел все эти strcat и strcpy звонки. Я никогда не использовал эту библиотеку Nan, я понятия не имел, что это C++. Не нужно ниспровергать. Кроме того, malloc также должен работать на C++. –

+0

Теги содержат 'C++'. Плагины Node.js написаны на C++. Он вызывает функции-члены на объекте с именем 'info', который, очевидно, возвращает' * this', а это _C++ - ish_. Почему вы предположили, что OP использует C? – skypjack

1

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

Смежные вопросы