2014-03-26 49 views
0

我得到这个错误KERN_PROTECTION_FAILURE使用静态映射和std :: make_pair

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_PROTECTION_FAILURE at address: 0xb064425c 

当下面的函数调用:

const std::map<FunctionID, std::string> getEnumElementsStringRepresentation() { 
    static bool is_initialized = false; 
    static std::map<FunctionID, std::string> enum_string_representation; // Fails here 
    if (false == is_initialized) { 
    enum_string_representation.insert(std::make_pair(FunctionID.capabilities, "capabilities")); 
    ... many more similar inserts 
    is_initialized = true; 
    } 
    return enum_string_representation; 
} 

这似乎是一个读/写错误,但我我不确定调试的最佳方式。

+0

看起来像一个iPhone的具体事情。我搜索了EXC_BAD_ACCESS并找到了很多结果。你研究过那种东西吗? –

+0

是的,这不是在iPhone上,而是在Mac上。注意到这种行为在Linux机器上似乎不普遍 – JuJoDi

+0

是否有多线程应用程序?不知道如何从上述错误到达堆栈溢出,它似乎表明一个错误的读取或写入。即使C++ 11(和一个兼容的编译器),你的代码仍然不是线程安全的。 –

回答

2

你说你的代码是多线程的。由于功能 - 静态map实例,getEnumElementsStringRepresentation不可重入(通常)。你必须用互斥体来保护函数,或者使用线程本地存储。