NodeJS Addon Unordered_map not supported?

NodeJS Addon Unordered_map not supported?

本文关键字:not supported map Addon Unordered NodeJS      更新时间:2023-10-16

我正在使用C++的Laurena库将JSON的序列化添加到我的Node Addon中。当我初始化库时,它会到达代码中的一个特定点,在那里它定义了两个无序映射对象。它们没有初始化,而是立即使用(如下面的代码所示)。对无序映射中的任何数据或任何方法的任何访问都会导致向量下标超出范围失败。

但仅在nodejs中。

如果我提取插件代码并将其转储到Visual Studio 2013 C++控制台应用程序中,而不做任何更改,它就会完美运行。有人能告诉我这些在常规控制台应用程序的节点中不受支持的未定义映射的方向吗?

using namespace laurena;
std::unordered_map<std::string, const descriptor*>      classes::_classes_by_name;
std::unordered_map<size_t, const descriptor*>           classes::_classes_by_typeid;
void classes::add(const descriptor* myClass)
{
   for(int i = 0; i< _classes_by_typeid.size(); i++)
   {
       printf("in array I (%d) : %Iu", i, _classes_by_typeid[i]); //FAILS!
   }
    // also failes
    printf("Access ANYTHING? %s n", _classes_by_typeid.hash_function());

   // Doesn't fail? WTF??
   printf("Post Set array size :: %dn", _classes_by_name.size());
   printf("Post Set array size :: %dn", _classes_by_typeid.size());
}

我是Laurena的作者。

当前版本中Laurena的库有一个很大的缺陷,因为它使用全局静态变量来存储类描述符。更好的实现是将它们存储到动态初始化的单例中。

一个可能的解释是,您从另一个库的静态成员/全局数据构造函数中调用laurena::classes::add。静态/全局数据构造函数在int main(…)之前执行

在这种情况下,如果数据的构造函数在laurena的静态映射构造函数之前被调用,那么是的,您可能会出现所描述的错误。看见什么是"静态初始化顺序的惨败"在https://isocpp.org/wiki/faq/ctors#static-init order获取有关此问题的更多详细信息。

然后有两个选项:

1) laurena::classes静态数据必须封装到动态创建的singleton中。laurena::classes::add方法应该看起来像

void classes::add(const descriptor* myClass) // classes::add is a static class function
{
    classes* p = classes::get_or_create_instance ();
    p->_classes_by_name[myClass->name()] = myClass;
    p->_classes_by_typeid[std::type_index(myClass->type()).hash_code()] = myClass;
}

2) 将调用移动到类::add到int main(…):

int main ()
{
    // laurena's initialization
    laurena::classes::init();
    // let's declare TheNerd serializables classes :
    declare_TheNerd_classes();
   ...
}

如果你不能使用选项2,我可以修复选项1。