Необработанное исключение при попытке инициализировать динамический массив - PullRequest
0 голосов
/ 28 мая 2019

Я выделяю динамическую память в своем классе как private: variable

Затем в конструкторе я пытаюсь инициализировать массив.

public
Display(int Width, int Height) {
    nScreenHeight = Height;
    nScreenWidth = Width;
    DWORD dwBytesWritten = 0;
    for (int i = 0; i < (nScreenWidth*nScreenHeight); i++) screen[i] = L'';
    SetConsoleActiveScreenBuffer(hConsole);
}

private:
    int nScreenWidth;
    int nScreenHeight;
    wchar_t *screen = new wchar_t[nScreenWidth*nScreenHeight];

Если я пытаюсь запуститьЗапрограммировать исключение Unhanded в сгенерированном.

Необработанное сгенерированное исключение: нарушение прав записи.Это-> экран был 0x2096112.

При попытке инициализировать экран буфера с помощью L ''

1 Ответ

3 голосов
/ 28 мая 2019

Элементы инициализируются в порядке их появления в объявлении класса перед выполнением тела конструктора.Итак, что происходит:

  • nScreenWidth инициализируется по умолчанию (см. здесь )
  • nScreenHeight инициализируется по умолчанию
  • screen инициализируется с new wchar_t[nScreenWidth*nScreenHeight]
  • только теперь конструктор запускается, и вы присваиваете значения nScreenWidth и nScreenHeight

Используйте список инициализатора для всех членов, чтобы избежать путаницы:

Display(int Width, int Height) : 
   nScreenWidth(Width), nScreenHeight(Height), screen(new wchar_t[nScreenWidth*nScreenHeight])
{
    DWORD dwBytesWritten = 0;
    for (int i = 0; i < (nScreenWidth*nScreenHeight); i++) screen[i] = L'';
    SetConsoleActiveScreenBuffer(hConsole);
}

Еще лучше было бы использовать std::vector<wchar_t>, конструктор был бы

Display(int Width, int Height) : 
       nScreenWidth(Width), nScreenHeight(Height), screen(Width*Height)
{
    ...

и вместо того, чтобы беспокоиться о правиле трех / пяти Вы можете положиться на правило нуля.

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