如何在 NodeJs 原生插件中使用 std::map 的未包装C++对象



>我真的不明白为什么我的插件随机崩溃:

Fatal error in ../deps/v8/src/api.h, line 297
CHECK(allow_empty_handle || that != __null) failed

目前,我认为这可能是我的代码中与内存相关的问题,但我不确定我的方法是否正确。

下面是一些代码详细信息:

我的C++插件仅在主 NodeJs 应用程序启动时加载一次。主应用程序可以在我的插件中调用几个导出的函数。其中一个函数(下面命名为"Initialize")获取一个唯一 id,用于从全局定义的 std::map 对象(下面命名为 g_mapObject)中查找C++对象(下面命名为"MyObject")实例。如果在映射中找不到具有给定键的对象,则"初始化"函数将创建一个对象并将其插入到映射中,该对象的新实例,然后初始化此对象。其他导出的函数会定期从主应用程序调用。他们从地图中检索对象并对其进行操作。

在我的 MyAddon.cc:

#include "MyAddon.h"
#include "MyObject.h"
using namespace v8;
std::map<string, MyObject*> g_mapObject;
Handle<Value> MyAddon::Initialize(const Arguments& args) {
    HandleScope scope;
    String::AsciiValue id(args[0]->ToString());    
    // Get the object from g_mapObject and initialize it. 
    // If the object is not found then create and insert it into map.

    return scope.Close(0);
}
Handle<Value> MyAddon:UpdateObjectData1(const Arguments& args) {
    HandleScope scope;
    String::AsciiValue id(args[0]->ToString());
    // Get the object from g_mapObject and update its data
    return scope.Close(0);
}
Handle<Value> MyAddon::UpdateObjectData1(const Arguments& args) {
    HandleScope scope;
    String::AsciiValue id(args[0]->ToString());
    // Get the object from g_mapObject and update its data
    return scope.Close(0);
}

每个方法都包装了uv_mutex_lock/解锁调用,因此确保并测试方法调用是同步的。致命错误发生在"初始化"方法中(但从未在第一次调用时发生)。

PS:只是提到我使用C++11。

我的方法是正确的,但是在实现中存在一个逻辑错误。

相关内容

  • 没有找到相关文章

最新更新