2015-03-26 8 views
0

Я совершенно не знаком с C++, так что несите меня. В моем файле заголовка, у меня есть следующий класс заявил:Объявить указатель в заголовке приводит к нарушению доступа

#include "AC_Airframe_A330.h" 

class AC_App 
{ 
public: 
    AC_App(); 
    ~AC_App(); 

    HRESULT Initialize(); 

    AC_Airframe_A330 * m_Airframe; 
}; 

В моем файле C++, я использую следующий код, чтобы запустить программу, и начать создавать свои указатели:

#include "AC_App.h" 

AC_App * m_App; 

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 
{ 
    HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0); 

    if (SUCCEEDED(CoInitialize(NULL))) 
    { 
     { 

      if (SUCCEEDED(m_App->Initialize())) 
      { 
       m_App->RunMessageLoop(); 
      } 
     } 
     CoUninitialize(); 
    } 

    return 0; 
} 

HRESULT AC_App::Initialize() 
{ 
    //AC_Airframe_A330 * m_Airframe; 
    m_Airframe = new AC_Airframe_A330(); 

    m_Airframe->Startup_State(); 

<snip> 

Как вам может видеть, я поставил указатели в файле заголовка, который генерирует нарушение доступа Writing Место и адрес на этой линии

m_Airframe = new AC_Airframe_A330(); 

Если я комментирую строку заголовка из файла и раскомментируйте строку в моем In itialize функция, она работает. Почему это? Я хотел бы, чтобы объект m_Airframe был доступен для других вещей вне функции Initialize.

Что я делаю неправильно?

+5

Я вижу, где 'm_App' используется - но я не вижу, где он когда-либо присвоено значение. Вы вызываете метод на неинициализированном указателе, один указывает на случайный мусор. –

+0

У меня первоначально была линия AC_App * m_App = 0; чтобы NULL это, но это, казалось, не имеет значения? – Horgy

+0

@Igor: Его 'm_App' находится в глобальном масштабе и будет _default initialized_ равным нулю. Так что авария в любом случае разыменована. –

ответ

1

Перед использованием каких-либо ссылок на m_App вы должны передать его с new:

m_App = new AC_App(); 
+1

Aha! Я думал, что это будет что-то вроде этого. Спасибо Зак. Я вставил эту строку в WinMain, и теперь она работает :) Я бы поднял голову, но моя репутация недостаточно хороша. – Horgy

+1

Я бы рекомендовал заменить AC_App * на std :: unique_ptr и AC_Airframe_A330 * на std :: unique_ptr и использовать std :: make_unique вместо «new». При необходимости измените на std :: shared_ptr. Это делает несколько сложнее забыть удалить память после выделения. – Robinson

3

Указатель m_App был инициализирован константой нулевого указателя.

AC_App * m_App; 

Таким образом, когда функция член Initialize называется

if (SUCCEEDED(m_App->Initialize())) 

он пытается получить доступ к его члену данных на недействительный адрес

m_Airframe = new AC_Airframe_A330(); 

и ошибки "нарушение доступа" выдается.

Вы должны выделить (или определить) объект, на который будет ссылаться этот указатель.

+0

Хорошо, это имеет смысл, но как я могу создать объект m_App, который содержит все? Я ценю, что это может быть глупый вопрос, но мне трудно разобраться в указателях. – Horgy

+0

@Horgy Вы можете определить объект вместо указателя. –

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