我试着写简单的课。但一开始就遇到了问题。 当我编写构造函数,1个析构函数和1个show类方法并在main函数中调用它时出现意外错误。最有趣的是,在调试模式下,在VS2017社区中,错误抛出在不同的地方:一次在构造函数中,另一个在show方法中,最重要的是在main函数中返回0之后。 那是我的main.cpp
#include "MyScreen.h"
int main()
{
MyScreen scr = MyScreen(10, 10);
scr.show();
char ch;
std::cin >> ch;
return 0;
}
我的MyScreen类头文件
#pragma once
#include <iostream>
using std::cout;
class MyScreen
{
public:
MyScreen();
MyScreen(int, int, char pc = _filler);
~MyScreen();
void show();
private:
static const int maxHeight;
static const int maxWidth;
static const char _filler;
int _height;
int _width;
char *_wContent;
int _cursor;
};
和cpp文件
#include "MyScreen.h"
const int MyScreen::maxHeight = 28;
const int MyScreen::maxWidth = 118;
const char MyScreen::_filler = '#';
MyScreen::MyScreen()
{
_height = maxHeight;
_width = maxWidth;
unsigned length = _height * _width;
_wContent = new char(length);
for (int i = 0; i < length; i++)
_wContent[i] = _filler;
_cursor = 0;
}
MyScreen::MyScreen(int height, int width, char pc)
{
_height = height;
_width = width;
unsigned length = _height * _width;
_wContent = new char(length);
for (int i = 0; i < length; i++)
_wContent[i] = pc;
_cursor = 0;
}
MyScreen::~MyScreen()
{
delete[] _wContent;
_wContent = 0;
}
void MyScreen::show()
{
for (int i = 0; i < _height; i++)
{
for (int j = 0; j < _width; j++)
cout << _wContent[i * 10 + j] << i * 10 + j;
cout << '\n';
}
}
我收到了错误说明:
检测到严重错误c0000374 ScreenClass.exe已触发断点。 (xutility文件)
抛出异常:读取访问冲突。 ptd 是0x264FD5EC。 (fstream文件)
DEBUG ERROR! HEAP CORRUPTION DETECTED:在0x02ABC5A8的正常块(#152)之后。 CTR检测到应用程序在堆缓冲区结束后写入内存。
我无法理解我做错了什么?我试图在DevC ++中编译并运行此代码,它也会抛出错误(返回3221226356),但是在第3次重新编译该代码之后它开始工作没有错误!
这个问题属于VS2017吗?如果是,那么如何解决?
答案 0 :(得分:0)
解决方案: 应该是方括号:
_wContent = new char[length];
相反,如果使用简单括号,因为()分配空格并仅初始化1个值。但是在不同的IDE中可能存在不同的未定义行为(如DevC ++中)。
强烈建议使用std::vector<char>
来避免可能导致未定义行为的指针操作。
向Ron,Borgleader和Bo Persson寻求帮助。