Я выделяю динамическую память в своем классе как переменную private:
Затем в конструкторе я пытаюсь инициализировать массив.
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' '
wchar_t *screen = new wchar_t[nScreenWidth*nScreenHeight]; делает не то, что вы думаете. Интересно, компилируется ли это вообще. Поместите screen = new wchar_t[nScreenWidth*nScreenHeight] как минимум в список инициализаторов вашего конструктора.
Не имеет отношения к делу, из любопытства, что на самом деле оценивает L''? Я удивлен, что даже компилируется.
Это типа LPCWSTR просто пытается очистить буфер с пустыми местами. Но на самом деле я перепутал что где.
@WhozCraig Я знаю, верно? Я ожидал L"" (указатель на строку wchar_t с нулевым завершением), а не L'' . L'' должно привести к ошибке компилятора: error: empty character constant.
Наверное, надо было написать screen[i] = '\0'





Члены инициализируются в том порядке, в котором они появляются в объявлении класса, до выполнения тела конструктора. Итак, что происходит:
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)
{
...
и вместо того, чтобы беспокоиться о правило трех/пяти, вы можете положиться на правило нуля.
@WhozCraig не может поверить, что упустил шанс продвинуться std::vector ;)
@ ранее известный как_463035818, как вы упомянули, что члены инициализируются в том порядке, в котором они появляются в классе, и после запуска этого конструктора, поэтому не мог понять, почему произошло исключение?
@Kapil, о, я не упомянул об этом прямо. Посмотрите еще раз на мои маркеры, когда вы инициализируете вектор, вы инициализируете его размером 0, потому что только позже вы назначаете переданный размер членам. Затем, когда вы пытаетесь получить доступ к элементам массива, вы выходите за пределы
wchar_t *screen = new wchar_t[nScreenWidth*nScreenHeight];nScreenHeight и nScreenWidth не инициализируются при выполнении. Инициализируйтеscreenв своем конструкторе.