2016-10-11 11 views
3

私は理解できない次のような状況があります。 NodeJSからNanを使ってC++関数を呼び出しているアプリケーションがあります。次のようにC++側のコードは次のとおりです。C++からNodeJSにバッファを渡すと、データが消えます

#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バイトを取得しますが、彼らはランダムな値に満ちています。 NewBuffer()を作成する前に、str変数が指し示していた場所が再利用されたように見えます。

私の質問

私は何が起こっているかについての説明を取得したい、そして理想的に潜在的な解決策になるだろう。

答えて

0

私は問題がスタックに割り当てられ、Combineメソッドが終了すると、そのスタックは解放され(スタックからポップされ)、スタックにプッシュされる他のもので上書きされることになると思います。

char* str;と宣言し、str = new char[80];で動的に割り当てます。 strcpyとstrcatを使ってこれらの初期化をすべて行います。

+0

「malloc」?本当に? – skypjack

+0

@skypjack私はstrcatとstrcpyの呼び出しをすべて見たので、彼はCを使用していると仮定していました。私はそのNanライブラリを使ったことが一度もありませんでした。 downvoteする必要はありません。また、mallocはC++でも動作するはずです。 –

+0

タグには 'C++ 'が含まれています。 Node.jsプラグインはC++で書かれています。彼は明らかに '* this'を返す' info'という名前のオブジェクトのメンバ関数を呼び出しています。これは_C++ - ish_です。なぜOPがCを使っていると仮定しましたか? – skypjack

1

documentationによると、NewBufferは、データの所有権がバッファそのものに転送されるものと仮定します。
文字配列がまったくコピーされていない場合は、が消えます。スコープが不明なため、未定義のビヘイビアが発生すると出力されます。
ダイナミックメモリに配列を割り当て、バッファがその問題を解決するためにバッファを所有するようにする必要があります。
new演算子を使用して、文字配列を割り当て、NewBufferおよびに渡します。を削除しないでください。

関連する問題