2013-04-10 26 views
5

dizesini döndürmez. * V8 :: String :: Utf8Value (args [0] ] -> ToString()), 0.8.2 32-bit düğümde uygun dizeyi döndürür ve 0.8.8 64-bit düğümde uygun dizeyi döndürmez.* v8 :: String :: Utf8Value (args [0] -> ToString()) node.js addon argümanı

kimse nedenini anlıyor mu?

Benim node.js eklenti şöyle görünür:

#define BUILDING_NODE_EXTENSION 
#include <node.h> 

#define MAX_OUTPUT_BUF 80 
extern "C" char *do_sqlsig(char *in); 

using namespace v8; 

Handle<Value> Sqlsig(const Arguments& args) { 
HandleScope scope; 
char *c_arg, *ret; 

if (args.Length() < 1) { 
    ThrowException(Exception::TypeError(String::New("Wrong number of arguments"))); 
    return scope.Close(Undefined()); 
} 

c_arg = *v8::String::Utf8Value(args[0]->ToString()); 

ret = c_arg; //do_sqlsig(c_arg); 

return scope.Close(String::New(ret)); 
} 

void Init(Handle<Object> exports) { 
    exports->Set(String::NewSymbol("sqlsig"), 
     FunctionTemplate::New(Sqlsig)->GetFunction()); 
} 

NODE_MODULE(sqlsig, Init) 

ben, do_sqlsig C fonksiyonu için bir sarıcı yazıyorum görebileceğiniz gibi. C'yi çok iyi biliyorum ve C++ ile ilgili çok az şey biliyorum

cevap

9

İşaretçinin *v8::String::Utf8Value(args[0]->ToString());'dan döndüğü dize noktası bu satırın sonunda yok edilir (Utf8Value yok edildiğinde). Bir satırda Utf8Value nesnesini oluşturun ve yok edin. Bir sarkan işaretçiyi kaldırdığınızda ve farklı sürümlerde neden farklı sonuçlar gördüğünüzde tanımlanmamış bir davranıştır.

İki satıra bölün ve dize, Utf8Value nesnesinin kapsamı içerdiği sürece geçerli olacaktır.

v8::String::Utf8Value str(args[0]->ToString()); 
c_arg = *str;