Visual Studio Error
注意:文中所有“系统”用词,均指Windows Console操作系统IO
Debug Error 错误类型
#0表示调用约定错误
可以考虑在指针前面加上_stdcall。Dll库更新了,exe未更新也会报此错误。
#2表示栈溢出
-S是Stack around the variable … was corrupted的缩写
把12个浮点数数分配给整数数组的时候遇到了这个错误。错误一般都是指数组越界。
Stack around the variable … was corrupted的意思就是栈溢出。
可以看到,j小于12来做条件的时候,数组发生了栈溢出。原因是我定义的数组只有11个位置,如果j达到11的时候array[11]是不存在的,然而这种情况不同于未初始化的变量因为内存中数组只不过是一个位置与后面固定的长度,vs2015不会探测后方的内存是否在数组范围之内。导致的结果就是发生debug error#2错误。
#3表示使用了未初始化的变量
-T是The variable … is being used without being initialized的缩写
-T是The variable … is being used without being initialized的缩写。在switch case(或其他情况),case后方忘了break;就会出现#3报错。很明显day=31后面忘了break; 英文提示:the variable is being used without being defined(initialized)说的就是变量未定义,初始化的意思。
switch-case在内存中的运算方法和if-else是相同的。但是对于switch-case来说系统执行单减循环直至为零.
安装Visual Studio时登录等不上去的方法
- 退了360!退了360!退了360!
- 重新启动电脑
- 重新打开安装程序
- 把DNS修改为主选:114.114.114.114备选:8.8.8.8(参见360DNS优选)
分支条件没覆盖,不是所有分支都有返回值
什么叫分支条件没覆盖呢?比如if-else,两选一,肯定覆盖。比如if-else if,如果两个条件没满足,还有第三种可能,如果这种可能性处没有return,就认为没完全覆盖。
系统会默认后方还有一个空的else,然而这个else并没有return值。所以出现了C4715错误
项目加载失败。提示:该项目需要用户手动输入。
删除了原来的项目和文件夹,建立新的目录,问题即可解除
无法打开……进行写入
这其实是因为上一次运行的时候没有关闭,把上一个窗口关了,重新运行就没问题了
HANDLE hout的问题
为什么gotoxy函数没起作用?
事实上,HANDLE就是HANDLE的类型,上图中的HANDLE hout在main函数中相当于从新声明了hout,这样的话,hout对于main()来说就是局部变量。根据函数中局部变量会直接屏蔽全局变量的原则,这个赋值是对局部变量来说的。而gotoxy函数调用的是全局变量,此时全局变量是空的,因此gotoxy函数不会生效。
按照正常的赋值方法,这样全局变量hout就被正常的赋值了,可以看到此时gotoxy函数已经发挥了作用。这样一来又省去了把所有函数都加上HANDLE hout参数的麻烦。
warning MSB8028: The intermediate directory……
这个问题,和代码没有关系。原因在于重复建立了两个project指向了一个目录。
把需要的cpp拷贝出来,然后把这个项目删了(连文件夹都删掉)然后重新建立一个项目。再把cpp拷贝回去(虽然可以不拷贝,但是为了稳定,建议放在原文件夹。)再次运行,错误消失。
fatal error C1301: error accessing program database D:\Document\CPP_subject\School_asignments\Sudoku\Release\7-b6.ipdb, invalid format, please delete and rebuild
将模式改成x64,或者删除错误的文件
查错方法
如何判断数组越界?
现在故意犯了个错误,让最大为12的数组循环到30
程序崩溃,三号错误,表示数组越界。哪里越界?重新调试,但是这次只按F5。
调试程序报警,下方表明了错误位置。
点击中断,查看详细情况。
右侧明确的报出了出错的行数,而左侧则告知了异常位置,连内存地址都提供了出来。很明显i变成了随机数,month数组越界了。
说明一下,调试模式只会报出程序在哪一行终端,有时候错误的原因可能存在于其他位置,这个时候就要整理一下程序的思路沿着逻辑线索仔细查找。
还有一点说明。修改之后如果还报同样的错误,有可能是上一次的小黑窗没关
外部文件的函数如何查错?
遵循原则,返回什么,打印什么。
如果都是0,无法确定是那个0,就加几个自己认识的数字,就能快速区分出哪一个出的错。
Gotoxy函数失效?
Gotoxy函数无论如何也无法移动到指定位置,但是这一行的确执行了,原因是什么?
这一行的确是执行了,原因在于gotoxy函数的目标地点超出了控制台窗口的大小,这个时候此函数执行失败,系统自动继续读取。
循环次数超过预期导致显示混乱
类似于控制台打印时发生不可预知的错误,打印超过边界倒置自动换行出现混乱的形况,可以采用_getch()+打印循环次数的方法
采用类似方法可以把循环次数打印出来以及知道第几次循环出现了错误
这样一来随着每一步打印,都会出现类似于脚注的行列循环次数信。
使用不同的数据多次测试应用程序
对于同一个程序需要输入多组不同的数据进行测试的情况,可以考虑在程序开头和结束加入清屏和goto(或while(!))语句。
while(!){
……
}
System不明确
某处输入system(“pause”);后其他所有cout均会提示cout不明确
此时运行程序,不会提示任何错误
但是报错依旧存在
在头文件处包含#include<cstdlib>
问题得到解决
原本正常的控制台界面打印颜色出现排版混乱
错误的原因是因为控制台界面下方的中文输入法干扰了打印过程。
- 在进入正式打印结果的界面之前按shift(或其他按键)切换至英文输入法
- 规划窗口时为输入法预留一行空白,但不够美观
常见指针错误
野指针错误
对一个已经删除的地址进行访问,系统已经自动把指针指向的地址分配给其他内容。因此产生非法访问,报错
Debug Assertion Failed!
_finddata_t结构体产生错误
百度百科给的那个例子是错的,他是直接从stackoverflow上面抄来的别人的错例子。
原因在于
第一个if中的==优先级比=优先级高,_findfirst返回之后为假时发生判断短路
自动跳出if判断,此时handle句柄没有初值,导致下一步handle越界
既然这样解决方法也很简单了,加个括号或者把赋值放到long handle = _findfirst(file_path,&file_info);
常见指针越界
p=0xCCCCCCCC
0xCCCCCCCC就是我们常见的烫烫烫烫烫。一般是未初始化的字符串或者字符指针之类的
p=0x8123
0x8123是常见的指针错误,十有八九是
delete之后的指针复用了
因为指针在delete之后系统(很多时候)会把指针自动指向0x8123,一般情况下0x8123是不会作为程序数据的地址的
p=0x1110122
0x1110122一般是字符串·没strcpy进去,就是说
new方式出来的char ** p再次new char [] 得到的指针如果没赋值容易出现0x1110122
超级可怕的报错方式,调试没错,没有弹框,没有debug error,绝对让你想破脑袋也找不出来的指针错误
*.exe has triggered a breakpoint
问题的答案吗,很简单
比如
char * p= new char [];
strcpy(p,""); ...
... delete p;
崩溃点一般是那个delete p;
发现了吗?strcpy()越界了
如果再进一步进入delete内部查看,你会发现卡在一个_freeDBG()的函数上
大概解释一下,最通俗的说其实delete内部就是从c语言对free各种肢解移植派生继承封装之后得到的,卡在某某free函数也就不奇怪了。
问题就是因为new那个地方越界了是编译不报错的,但是delete的时候触碰到了new之后外的内存保护区
(所以我每次new的时候都使用strlen(str)+2,管你少几个,多来一个字符也死不了人对吧。总比越界了没反应死磕三天三夜强)
p=0x00000004
exe升序越界访问了自己不能访问的内存
所以啊,没事别老盯着别人有自己没有的东西看,羡慕也羡慕不来
错误原因吗,我早就想不起来了,当时写的时候急着赶作业,只截了个图下来,等我哪天想起来再告诉你们