代码之家  ›  专栏  ›  技术社区  ›  let4be

v8 Persistent SetWeak因NEAR_DEATH而崩溃

  •  0
  • let4be  · 技术社区  · 10 年前

    我的代码:

    struct WeakData {
        context* c;
        std::vector<UniquePersistent<Object>>::iterator i;
    };
    
    void WeakPtrCallback(const v8::WeakCallbackData<v8::Object, WeakData>& data) {
        printf("weak callback");
        fflush(stdout);
        // crashes always after exit from this callback
    }
    
    Local<Object> wrapDocumentSelection(Isolate* isolate, cDocumentSelection* selection) {
        EscapableHandleScope handle_scope(isolate);
        auto ctx = isolate->GetCurrentContext();
        Context::Scope context_scope(ctx);
    
        Local<External> contextWrap = Local<External>::Cast(
                Handle<Object>::Cast(isolate->GetCurrentContext()->Global()->GetPrototype())->GetInternalField(0));
        context* c = static_cast<context*>(contextWrap->Value());
    
        Local<ObjectTemplate> documentSelectionTemplate = Local<ObjectTemplate>::New(isolate, c->documentSelectionTemplate);
    
        Local<Object> jsSelection = documentSelectionTemplate->NewInstance(ctx).ToLocalChecked();
        jsSelection->SetInternalField(0, External::New(isolate, selection));
        jsSelection->Set(ctx, String::NewFromUtf8(isolate, "length"), Integer::New(isolate, selection->Length));
    
        c->trackingObjects.push_back(UniquePersistent<Object>(isolate, jsSelection));
        auto &p = c->trackingObjects.back();
        auto it = c->trackingObjects.end();
        it--;
    
        WeakData* wd = new WeakData;
        wd->c = c;
        wd->i = it;
    
        p.Reset(isolate, jsSelection);
        p.SetWeak<WeakData>(NULL, WeakPtrCallback);
        isolate->AdjustAmountOfExternalAllocatedMemory(1024);
    
        return handle_scope.Escape(jsSelection);
    }
    

    在上下文中,当 在WeakPtrCallback中,我需要清理一些外部分配的资源

    v8错误:

    #
    # Fatal error in ../src/global-handles.cc, line 325
    # Check failed: state() != NEAR_DEATH.
    #
    

    关于 https://strongloop.com/strongblog/node-js-v0-12-c-apis-breaking/ 我不需要在回调中执行任何与v8相关的清理

    持久性的存储单元将自动释放。如果您想用.ClearWeak()恢复它,请保留对原始v8::Persistent的引用。

    我还尝试使用Persistent和 Persistent<Value, CopyablePersistentTraits<Value>> -同样的错误。。。 有什么建议吗?

    1 回复  |  直到 10 年前
        1
  •  0
  •   let4be    10 年前

    好吧,我的C++似乎不够好 我追踪了向量的问题,因为某些原因,它无法正确地删除所需的元素,我猜迭代器是索引绑定的,所以删除之前的一些元素会破坏所有后续的迭代器引用。。。

    切换到std::map并将不断递增的计数器作为键完全解决了这个问题