* v8 :: String :: Utf8Value (args [0] -> ToString ()) не возвращает строку аргумента аддона node.js

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

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

Мой аддон 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 ++

6

Решение

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]