【问题标题】:Same address but different string地址相同但字符串不同
【发布时间】:2021-07-15 05:41:46
【问题描述】:

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

为什么?

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

info[0]='hello world' 的结果:

string hello world
       �AZ
ptr 0x65a4140
    0x65a4140
ptr 0x65a4140
    0x65a4140
string hello world
       �AZ

【问题讨论】:

  • 通常当您指向的对象被销毁时会发生这种情况,因此指针不再指向相同的数据。如果您在函数中返回指向局部变量的指针,就会发生这种情况。

标签: c++ nan v8


【解决方案1】:
    printf("string %s\n", *v8::String::Utf8Value(info.GetIsolate(), str));

在这里,您创建了一个v8::String::Utf8Value 类型的新对象。这是一个临时对象。此语句完成后,它将不再存在。这很好,但这不是:

    char *ptr = *v8::String::Utf8Value(info.GetIsolate(), str);
    printf("       %s\n", ptr);

第一行代码执行后,v8::String::Utf8Value 不再存在。所以ptr 没有指向任何东西。 (如果您认为可以,请说明您将如何释放它指向的内存。)因此您以后无法访问它,但您的 printf 可以。

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多