2013-04-10 6 views
5

Я обнаружил, что * v8 :: String :: Utf8Value (args [0 ] -> ToString()) возвращает правильную строку на узле 0.8.2 32-bit и не возвращает правильную строку на узле 0.8.8 64-bit.* v8 :: String :: Utf8Value (args [0] -> ToString()) не возвращает строку node.js аргумент addon

кто-нибудь понимает, почему?

Мой node.js аддон выглядит следующим образом:

#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) 

Как вы можете видеть, что я пишу оболочку для функции C, do_sqlsig. Я знаю C очень хорошо и очень мало знаю о C++

ответ

9

Строка, возвращаемая указателем от *v8::String::Utf8Value(args[0]->ToString());, находится в конце этой строки (когда Utf8Value уничтожен). Вы создаете и уничтожаете объект Utf8Value в одной строке. Неопределенное поведение при разыменовании висячего указателя и почему вы видите разные результаты в разных версиях.

Разделите его на две строки, и строка будет действительна до тех пор, пока ваш объект Utf8Value находится в зоне действия.

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

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

  • Нет связанных вопросов^_^