地址相同但字符串不同

Seo*_*ong 0 c++ v8 nan

下面的结果显示两个相同的字符串指针具有不同的值。

为什么?

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)

Dav*_*rtz 5

    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