2016-01-24 84 views
2

定義靜態類變量時出現運行時訪問衝突錯誤。我不太確定究竟發生了什麼問題;是我調用的靜態函數在調用時沒有實現,還有其他的東西?調用靜態成員函數會導致運行時錯誤

怎麼回事,我該如何解決這個問題?

運行時錯誤(見下文代碼發生在錯誤的行):

0000005:訪問衝突讀取位置00000000。

代碼:

// Status.h 
class Status 
{ 
public: 
    // Static Properties// 
    static const Status CS_SUCCESS; 

    // Static Functions // 
    static const Status registerState(const tstring &stateMsg) 
    { 
     int nextStateTmp = nextState + 1; 
     auto res = states.emplace(std::make_pair(nextStateTmp, stateMsg)); 

     return (res.second) ? Status(++nextState) : Status(res.first->first); 
    } 

private: 
    static std::unordered_map<STATE, tstring> states; 
    static STATE nextState; 
}; 


// Status.cpp 
#include "stdafx.h" 
#include "Status.h" 

// Class Property Implementation // 
State Status::nextState = 50000; 
std::unordered_map<STATE, tstring> Status::states; 
const Status S_SUCCESS = Status::registerState(_T("Success")); 


// IApp.h 
class IApp : protected Component 
{ 
public: 

    static const Status S_APP_EXIT; 
    static const Status S_UNREGISTERED_EVT; 

    ... 
}; 


// IApp.cpp 
#include "stdafx.h" 
#include "../EventDelegate.h" 
#include "../Component.h" 
#include "IApp.h" 

// Class Property Implementation // 
const Status IApp::S_APP_EXIT = CStatus::registerState(_T("IApp exit")); // Runtime error: 0xC0000005: Access violation reading location 0x00000000. 
const Status IApp::S_UNREGISTERED_EVT = CStatus::registerState(_T("No components registered for this event")); 
+3

有兩件事:1)你是否使用過調試器來調試你的應用程序,如果沒有,爲什麼不呢? 2)不要發佈無法自行編譯的代碼的各種隨機部分,而需要發佈一個最小化,完整,可驗證的示例,請參閱http://stackoverflow.com/help/mcve以獲取更多信息。我沒有在您的問題中看到任何特定於Microsoft Windows平臺的問題,因此您的最小,完整,可驗證示例必須可在任何平臺上編譯和執行。 –

回答

1

一些靜態變量,如S_APP_EXIT取決於其初始化其他靜態變量(例如nextState)。

閱讀關於static initialization order fiasco並相應地修復您的代碼(使nextState成爲一個私有變量?)。你甚至可以考慮使用構建首先使用成語(解釋在其他常見問題here)。

無論如何,我通常不會建議保持所有這些變量是靜態的,但很難從您發佈的摘錄中分辨出來(CS_SUCCESS定義在哪裏?)。

相關問題