Авария на V8 'Контекст :: Новый - PullRequest
0 голосов
/ 11 октября 2019

Я реализую обертку вокруг движка Google V8. Я написал класс:

class Es
{
public:
    Es();
    ~Es();

    int Init(const char* exec_path);

    int CreateContext(uint& id);
    int RemoveContext(const uint id);

protected:
    Global<Context> global_context;
    std::map<uint, Persistent<Context>*> contexts;
    Isolate* isolate = nullptr;

private:
    uint next_id = 1;
};

Я хочу создавать контексты, удерживать их в контекстах var и удалять их в один день. Итак, я запускаю движок V8:

int Es::Init(const char* exec_path)
{
    v8::V8::InitializeICUDefaultLocation(exec_path);
    v8::V8::InitializeExternalStartupData(exec_path);
    std::unique_ptr<Platform> platform = platform::NewDefaultPlatform();
    V8::InitializePlatform(platform.get());
    V8::Initialize();

    Isolate::CreateParams create_params;
    create_params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
    isolate = Isolate::New(create_params);
    if (!isolate)
        return InitError;

    return Success;
}

И после этого я хочу создать контекст, используя int Es :: CreateContext (uint & id). Он вызывается после Init.

int EasyProspect::CreateContext(uint& id)
{
    if (!isolate)
        return NotInitializedError;

    Isolate::Scope isolate_scope(isolate);
    HandleScope handle_scope(isolate);
    Local<Context> local_context = Context::New(isolate);
    Persistent<Context> context(isolate, local_context);
    contexts.emplace(id, &context);
    return Success;
}

Но я не могу этого сделать, код падает на Context :: New (изолят). Почему? изолировать не ноль, я вхожу в локальную область ...

1 Ответ

2 голосов
/ 11 октября 2019

Лучше всего компилировать в режиме отладки и запускать в отладчике. Тогда должно быть легко определить причину сбоя.

(По крайней мере, вы должны опубликовать полный воспроизводимый пример, включающий указание версии V8, с которой вы работаете, как она построена / настроена, икак вы компилируете свой код.)

Если бы мне пришлось угадывать: Platform и ArrayBuffer::Allocator должны оставаться в живых до тех пор, пока вы хотите использовать экземпляр V8, но в вашем кодеони оба уничтожены в конце Es::Init. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * «« + »-« Это может быть добавлен ».

...