VS2017社区中的C++程序崩溃
Posted
技术标签:
【中文标题】VS2017社区中的C++程序崩溃【英文标题】:C++ program crash in VS2017 Community 【发布时间】:2018-04-07 12:48:31 【问题描述】:我尝试编写简单的类。但一开始遇到问题。 当我编写构造函数、1 个析构函数和 1 个显示类方法并在主函数中调用它时,我遇到了意外错误。最有趣的是,在调试模式下,在 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 文件)
调试错误! 检测到堆损坏:在 0x02ABC5A8 的正常块 (#152) 之后。 CTR 检测到应用程序在堆缓冲区结束后写入内存。
我不明白我做错了什么?我尝试在 DevC++ 中编译和运行此代码,它也抛出错误(返回 3221226356),但在该代码的第三次重新编译时它开始工作而没有错误!
这个问题属于VS2017吗?如果是,那么如何解决?
【问题讨论】:
应该是_wContent = new char[length];
。照原样,您只为一个元素分配空间,随后越界读取导致未定义的行为。
@Ron 应该是std::vector<char>
。 FTY
@NemoUA 正如 cmets 中所指出的,您应该更喜欢 std::vector<char>
方法,因为应该避免这种原始指针操作。
DevC++ 接受new char(length)
,因为它是有效的 C++。但是将其视为数组会导致未定义的行为。看起来工作正常是未定义行为的有效表现。抛出指示堆损坏的错误也是未定义行为的有效表现。做其他事情也是。
@NemoUA - 尽管看起来非常相似,new char(value);
分配一个带有初始值的字符,而new char[length];
分配一个字节序列。
【参考方案1】:
解决方案: 应该是方括号:
_wContent = new char[length];
而不是简单的括号,因为()分配空间并仅初始化1个值。但是在不同的 IDE 中可能会有不同的未定义行为(如在 DevC++ 中)。
强烈建议使用std::vector<char>
以避免可能导致未定义行为的指针操作。
非常感谢 Ron、Borgleader 和 Bo Persson 的帮助。
【讨论】:
以上是关于VS2017社区中的C++程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
使用 mcmodel=medium 编译时 C++ 程序崩溃 [关闭]