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

时间:2019-05-28 17:31:59

标签: c++ oop memory

我正在将我的类中的动态内存分配为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];

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

引发未处理的异常:写访问冲突。 此->屏幕为0x2096112。

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

1 个答案:

答案 0 :(得分:3)

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

  • nScreenWidth是默认初始化的(请参见here
  • nScreenHeight已默认初始化
  • screennew 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)
{
    ...

您不必依赖rule of three/five,而可以依靠零规则。