不支持 NodeJS 插件 Unordered_map?
Posted
技术标签:
【中文标题】不支持 NodeJS 插件 Unordered_map?【英文标题】:NodeJS Addon Unordered_map not supported? 【发布时间】:2014-09-29 16:43:37 【问题描述】:我正在使用 C++ 的 Laurena 库将 JSON 序列化添加到我的 Node Addon。当我初始化库时,它会到达代码中定义两个 unordered_map 对象的特定点。它们没有被初始化,而是立即使用(如下面的代码)。对 unordered_maps 中的任何数据或任何方法的任何访问都会导致向量下标超出范围失败。
但仅在 nodejs 中。
如果我提取插件代码并将其转储到 Visual Studio 2013 C++ 控制台应用程序中,无需任何更改,它就会完美运行。谁能指出这些 unodered_maps 在常规控制台应用程序中的节点中不受支持的方向?
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 :: %d\n", _classes_by_name.size());
printf("Post Set array size :: %d\n", _classes_by_typeid.size());
【问题讨论】:
这件事可能是 C++11 的一部分,它是 unordere_map。检查你的 node.js 插件编译器是否支持 C++11。 它使用的是node-gyp,它根据项目所说的使用msbuild。该项目目前设置为使用Visual Studio 2013。据我所知,从VS 2012开始就支持c++11 我猜这里的问题是由具有非平凡构造函数的静态成员引起的。它应该被初始化,显然它没有。尝试手动初始化它们。 【参考方案1】:我是 Laurena 的作者。
当前版本中的 Laurena 库有一个很大的缺陷,因为它使用全局静态变量来存储类描述符。更好的实现方式是将它们存储到动态初始化的单例中。
一个可能的解释是您从另一个库的静态成员/全局数据构造函数调用 laurena::classes::add。静态/全局数据构造函数在 int main (...) 之前执行
在这种情况下,如果您的数据的构造函数在 laurena 的静态映射构造函数之前调用,那么是的,您可能会遇到您描述的错误。看 什么是“静态初始化顺序失败”?https://isocpp.org/wiki/faq/ctors#static-init-order 了解有关此问题的更多详细信息。
那么有两种选择:
1) laurena::classes 静态数据必须包装成一个动态创建的单例。 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) 将对 classes::add 的调用移动到 int main ( ... ) 中:
int main ()
// laurena's initialization
laurena::classes::init();
// let's declare TheNerd serializables classes :
declare_TheNerd_classes();
...
如果你不能使用选项 2,我可以解决选项 1。
【讨论】:
以上是关于不支持 NodeJS 插件 Unordered_map?的主要内容,如果未能解决你的问题,请参考以下文章