2016-01-24 3 views
2

Я получаю ошибку нарушения доступа во время выполнения при определении статической переменной класса. Я не совсем уверен, что именно происходит неправильно; это статическая функция, которую я вызываю не реализована во время вызова, что-то еще?Вызов функции статического члена вызывает ошибку времени выполнения

Что происходит не так и как я могу это исправить?

Ошибка выполнения (см ниже код для линии, что происходит ошибка):

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")); 
+3

Две вещи: 1) Вы использовали отладчик для отладки вашего приложения, а если нет, почему бы и нет? 2) Вместо публикации различных случайных частей вашего кода, которые не могут быть скомпилированы самостоятельно, вам нужно опубликовать минимальный, полный, проверенный пример, см. Http://stackoverflow.com/help/mcve для получения дополнительной информации. Я ничего не вижу в вашем вопросе, который характерен для платформы Microsoft Windows, поэтому ваш минимальный, полный, проверенный пример должен быть компилируемым и исполняемым на любой платформе. –

ответ

1

Некоторые статические переменные, такие как S_APP_EXIT зависят от других статических переменных (например, nextState) для их инициализации.

Читайте о static initialization order fiasco и исправьте свой код соответствующим образом (делая nextState частной переменной?). Возможно, вы даже подумали об использовании Construct on First Use Idiom (поясняется в других FAQ here).

В любом случае, я бы вообще не советовал сохранять все эти переменные статическими, но довольно сложно сказать только из выдержки, которую вы опубликовали (где CS_SUCCESS определено?).

Смежные вопросы