我正在将我的类中的动态内存分配为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''初始化缓冲区屏幕时
答案 0 :(得分:3)
在构造函数的主体执行之前,成员按照它们在类声明中出现的顺序进行初始化。所以发生的是:
nScreenWidth
是默认初始化的(请参见here)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)
{
...
您不必依赖rule of three/five,而可以依靠零规则。