NodeJS Addon Unordered_map not supported?
NodeJS Addon Unordered_map not supported?
我正在使用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。
相关文章:
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- OpenCV Android C++ imwrite not found
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- MATLAB to C++: csvread() not supported by MATLAB Coder
- 如何修复 SDL2 "GLSL 3.30 is not supported"错误
- 在 OpenGL 中在 Mac 上编译着色器时出现"version not supported"错误
- C++ GLSL 着色器:"error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES,
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- MAC OpenGL 着色器错误:"version '150' is not supported "
- C++ 使用 Curl 库编程 - 抛出错误"protocol https not supported or disabled."
- C/C++ getnameinfo ai_family not supported
- UWP BitmapEncoder SetProperties is not supported
- PTXAS 在结构数组上使用 thrust::sort 时"double is not supported"警告
- nullptr_type not supported by simple_type_specifier
- NodeJS Addon Unordered_map not supported?
- 结构成员顺序导致"non-trivial designated initializers not supported"错误
- QTcpServer->listen() on WinCE6 "protocol type not supported"
- OpenCV- 使用 cvProjectPoints2 时的"Homogeneous coordinates are not supported"
- 英特尔C++编译器给出"offload constructs are not supported on this platform"错误