Странная проблема MFC c ++ - PullRequest
2 голосов
/ 07 января 2011

Я делаю простое приложение в MFC /c++. Этот код предназначен для создания диалога в классе CWinApp. Он прекрасно компилируется, а также работает нормально, но только если я запускаю его из VStudio.But, если я запускаю его напрямую, ошибка времени выполненияпроизошла ошибка и произошел сбой программы.

CMyDialog dlg;
m_pMainWnd = (CWnd*)&dlg;
dlg.DoModal();

, но если бы я использовал код, приведенный ниже, то все в порядке. Я не мог бы понять это поведение.

CMyDialog *dlg=new CMyDialog();
m_pMainWnd = (CWnd*)dlg;
dlg->DoModal();

Такого рода вещи былислучалось много раз прежде и для меня в некоторых других прошлых проектах C ++ (не MFC).пожалуйста, укажите это для меня.

Ответы [ 3 ]

2 голосов
/ 07 января 2011

В первом случае объект уничтожается (когда dlg выходит из области видимости), но все равно на него указывает m_pMainWnd.Возможно / вероятно, что что-то вызывает использование m_pMainWnd и доступ к объекту, который больше не существует.

Измените первый пример на:

CMyDialog dlg;
m_pMainWnd = (CWnd*)&dlg;
dlg.DoModal();
m_pMainWnd = NULL;

Если это решает проблему, причинавам это сошло с рук во втором случае, когда объект не был уничтожен (хотя m_pMainWnd указывает на него, MFC может уничтожить его для вас, когда программа закрывается; в действительности, это может быть причиной сбоя в другомслучай).

1 голос
/ 07 января 2011

Проблема в том, что вы устанавливаете m_pMainWnd на окно, которое больше не будет существовать при закрытии диалога, и это обычно происходит за до уничтожения диалога, как раз при закрытии диалога (когдаDoModal возвращает).

Я решил эту проблему, создав фиктивное окно и используя его в качестве основного окна:

class CDummyWindow : public CFrameWnd
{
public:
    CDummyWindow()
    {
        Create(NULL, NULL);
    }
};

Class::InitInstance()
{
  ...
  CDummyWindow win;
  m_pMainWnd = &win;
  ...
  return FALSE;
}

Убедитесь, что вы return FALSE указали, что приложениеостановка.

1 голос
/ 07 января 2011

Основное различие между этими двумя кодовыми блоками заключается в том, что в первом случае dlg будет уничтожено в конце блока, а во втором - здесь не уничтожено ни в одном коде.

Учитывая остальную часть вашей программы, нужен ли dlg в конце блока, в котором он объявлен?Если это так, вам нужно использовать что-то вроде второго блока.

В качестве альтернативы, возможно, что DoModal вызывает delete(this) (прямо или косвенно) - в этом случае dlg должно быть сделано с помощью new.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...