定义静态类变量时,我收到运行时访问冲突错误。我不太确定究竟出了什么问题;是我调用的静态函数,在调用时没有实现,还有什么?
出了什么问题,我该如何解决?
运行时错误(请参阅下面的代码,了解发生错误的行):
0xC0000005:访问冲突读取位置0x00000000。
代码:
// 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"));
答案 0 :(得分:1)
某些静态变量(如S_APP_EXIT
)依赖于其他静态变量(例如nextState
)进行初始化。
了解static initialization order fiasco并相应修改代码(将nextState
设为私有变量?)。您甚至可以考虑使用 Construct On First Use Idiom (在其他FAQ here中进行了解释)。
无论如何,我通常不建议将所有这些变量保持静态,但很难从你发布的摘录(CS_SUCCESS
定义的地方?)中判断出来。)