2014-09-29 136 views
1

我正在与C++的Laurena库一起工作,将序列化添加到JSON中以添加到我的Node Addon中。当我初始化库时,它会在代码中定义两个unordered_map对象的特定点。他们没有初始化,而是立即使用(如下面的代码)。对unordered_maps内的任何数据或任何方法的任何访问都会导致向量下标超出范围失败。不支持NodeJS Addon Unordered_map?

但仅限于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()); 
} 
+0

可能是C++ 11中的一部分whis是unordere_map。检查你的node.js插件编译器是否支持C++ 11。 – teivaz 2014-09-29 16:54:13

+0

它使用node-gyp,根据项目所说的使用msbuild。该项目目前设置为使用Visual Studio 2013.据我所知,自2012年以来支持C++ 11 – TheNerd 2014-09-29 17:26:09

+0

我想这里的问题是由具有不平凡构造函数的静态成员造成的。它应该被初始化,显然它没有。尝试手动初始化它们。 – teivaz 2014-09-29 18:39:35

回答

0

我是Laurena的作者。

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

可能的解释是你致电laurena :: classes :: add来自另一个库的静态成员/全局数据构造函数。在这种情况下,如果你的数据的构造函数在laurena的静态映射构造函数之前被调用,那么你可以有你描述的错误。请参阅 什么是“静态初始化顺序失败”?https://isocpp.org/wiki/faq/ctors#static-init-order有关此问题的更多详细信息。

然后有两个选项:

1)laurena ::类的静态DATAS必须包装成动态创建一个单。 laurena ::类::添加方法应该看起来那么

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)移动到类调用::加入到INT主(...):

int main() 
{ 

    // laurena's initialization 
    laurena::classes::init(); 

    // let's declare TheNerd serializables classes : 
    declare_TheNerd_classes(); 

    ... 
} 

如果您不能使用选项2,选项1是我可以解决的问题。