异常 尝试初始化动态数组时未处理

Exception Unhandled while trying to initialize dynamic array

本文关键字:数组 未处理 动态 初始化 异常      更新时间:2023-10-16

我正在将类中的动态内存分配为私有:变量

然后在构造函数中,我尝试初始化数组。

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];

如果我尝试运行该程序,则会抛出异常。

引发未经处理的异常:写入访问冲突。这个>屏幕是0x2096112。

尝试使用 L' ' 初始化缓冲区屏幕时

Memeber 按照它们在执行构造函数主体之前在类声明中出现的顺序进行初始化。所以发生的事情是:

  • nScreenWidth默认初始化(请参阅此处(
  • nScreenHeight默认初始化
  • screen使用 new wchar_t[nScreenWidth*nScreenHeight]
  • 初始化
  • 直到现在构造函数运行,您才将值分配给nScreenWidthnScreenHeight

为所有成员使用初始值设定项列表以避免混淆:

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)
{
    ...

与其为三/五规则而烦恼,不如依靠零规则。