6

我发现 *v8::String::Utf8Value(args[0]->ToString()) 在节点 0.8.2 32 位上返回正确的字符串,并且在节点 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++知之甚少

4

1 回答 1

10

返回的指针指向的字符串*v8::String::Utf8Value(args[0]->ToString());在这一行的末尾被销毁(何时Utf8Value被销毁)。Utf8Value您可以在一行中创建和销毁一个对象。取消引用悬空指针时这是未定义的行为,以及为什么您在不同版本上看到不同的结果。

将其分成两行,只要您的Utf8Value对象在范围内,字符串就会有效。

v8::String::Utf8Value str(args[0]->ToString());
c_arg = *str;
于 2013-04-10T03:12:09.063 回答