下面的结果显示两个相同的字符串指针具有不同的值。
为什么?
v8::String::Utf8Value 只给出它的字符串成员,见https://v8docs.nodesource.com/node-0.8/d4/da0/v8_8h_source.html#l01286
#include <nan.h>
#include <string>
NAN_METHOD(Print) {
Nan::MaybeLocal<v8::String> maybeString = Nan::To<v8::String>(info[0]);
if (maybeString.IsEmpty() == false) {
v8::Local<v8::String> str = maybeString.ToLocalChecked();
char *ptr = *v8::String::Utf8Value(info.GetIsolate(), str);
printf("string %s\n", *v8::String::Utf8Value(info.GetIsolate(), str));
printf(" %s\n", ptr);
printf("ptr %p\n", *v8::String::Utf8Value(info.GetIsolate(), str));
printf(" %p\n", ptr);
printf("ptr %p\n", (char *)*v8::String::Utf8Value(info.GetIsolate(), str));
printf(" %p\n", (char *)ptr);
printf("string %s\n", (char *)*v8::String::Utf8Value(info.GetIsolate(), str));
printf(" %s\n", (char *)ptr);
}
}
NAN_MODULE_INIT(Init) {
Nan::Set(target, Nan::New("print").ToLocalChecked(),
Nan::GetFunction(Nan::New<v8::FunctionTemplate>(Print)).ToLocalChecked());
}
NODE_MODULE(myaddon, Init);
Run Code Online (Sandbox Code Playgroud)
结果info[0]='hello world':
string hello world
?AZ
ptr 0x65a4140
0x65a4140
ptr 0x65a4140
0x65a4140
string hello world
?AZ
Run Code Online (Sandbox Code Playgroud)
printf("string %s\n", *v8::String::Utf8Value(info.GetIsolate(), str));
Run Code Online (Sandbox Code Playgroud)
在这里,您创建一个类型为 的新对象v8::String::Utf8Value。这是一个临时对象。此语句一完成,它将不再存在。这很好,但这不是:
char *ptr = *v8::String::Utf8Value(info.GetIsolate(), str);
printf(" %s\n", ptr);
Run Code Online (Sandbox Code Playgroud)
第一行代码执行后,v8::String::Utf8Value就不再存在了。所以ptr没有指向任何东西。(如果您认为确实如此,请解释您将如何释放它指向的内存。)因此您以后无法访问它,但您可以访问它printf。