2014-03-26 69 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不可重入(通常)。你必須用互斥體來保護函數,或者使用線程本地存儲。