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

Metio_1993

我在我的班级中分配动态内存作为 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];

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

抛出未处理的异常:写访问冲突。this->screen 是 0x2096112。

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

large_prime_is_463035818

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

  • 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);
}

更好的是使用 a std::vector<wchar_t>,构造函数将是

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

而不是打扰三/五规则,你可以依靠零规则。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章