>我真的不明白为什么我的插件随机崩溃:
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。
我的方法是正确的,但是在实现中存在一个逻辑错误。