关于出现Unhandled exception at 0x091f11c7 in ****: 0xC0000005: Access violation reading location 0x0ab0f

原文地址

崩溃信息

Unhandled exception at 0x091f11c7 in : 0xC0000005: Access violation reading location 0x0ab0f6cc.

这样的崩溃信息,从字面上看, 就是  0xC0000005 这个地址的东西是不允许访问的。

至于什么情况下会出现这个错误呢? 之前问过一个这样的问题,当时是一个非常低级的错误,我在一个群里面问这个问题,然后有一个懂的来回答,说是像变量未初始化,我就想我明明初始化了,可是为什么? – -。 后来发现了问题所在想说有够傻x的啊,我定了一个类的成员变量,然后在类成员函数里面又定义了一个相同名字的局部变量,然后直接等于的,然后程序到这里就崩溃了 = =。 有这样的么??只能说太低级了这错误。反省够了再回过头来看看,专门从一个地址或者错误就能定位问题所在,我就在想怎么人家这么厉害呢?然后就开始查找,后来搜到了关于这样的内容,忘了是在哪里看到的了,就是关于什么样的内存地址被初始化为什么值。 好像记得一个0xffffffff之类的,如果是一个非正常值。这块资料确实忘了,等找到了资料再来贴上来。

对于上面的那个问题,有可能是 

1.野指针访问  

2.数组访问越界。  

3.多线程没有做好同步导致的问题 

4. 访问一个已经释放的指针。   

这些简单的道理是导致问题的根本原因,要多做好代码规范化,才能更好的避免一些低级错误。我能想到的原因就这些,如果有补充的,欢迎大家评论补充~~  ^_^~~~


在vs里面进行调试,如果已分配的内存会用 0xcd来填充。已释放的内存用0xdd填充。被保护的内存用0xfd填充。

下面是详细的解释:

* 0xcccccccc : Used by Microsoft’s C++ debugging runtime library to mark uninitialised stack memory

* 0xcdcdcdcd : Used by Microsoft’s C++ debugging runtime library to mark uninitialised heap memory

* 0xfeeefeee : Used by Microsoft’s HeapFree() to mark freed heap memory

* 0xabababab : Used by Microsoft’s HeapAlloc() to mark “no man’s land” guard bytes after allocated heap memory

* 0xabadcafe : A startup to this value to initialize all free memory to catch errant pointers

* 0xbaadf00d : Used by Microsoft’s LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory

* 0xbadcab1e : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger

* 0xbeefcace : Used by Microsoft .NET as a magic number in resource files

平时我们只需要了解上面常见的三种就可以了:0xcccccccc、0xcdcdcdcd和 0xfeeefeee ,以帮我们迅速地发现问题并分析问题。

对于0xcccccccc和0xcdcdcdcd,在 Debug 模式下,VC 会把未初始化的栈内存上的指针全部填成 0xcccccccc ,当字符串看就是 “烫烫烫烫……”;会把未初始化的堆内存上的指针全部填成 0xcdcdcdcd,当字符串看就是 “屯屯屯屯……”。那么调试器为什么要这么做呢?VC的DEBUG版会把未初始化的指针自动初始化为0xcccccccc或0xcdcdcdcd,而不是就让取随机值,那是为了方便我们调试程序,如果野指针的初值不确定,那么每次调试同一个程序就可能出现不一样的结果,比如这次程序崩掉,下次却能正常运行,这样显然对我们解bug是非常不利的,所以自动初始化的目的是为了让我们一眼就能确定我们使用了未初始化的野指针了。

对于0xfeeefeee,是用来标记堆上已经释放掉的内存。注意,如果指针指向的内存被释放了,变量变量本身的地址如未做改动,还是之前指向的内存的地址。如果该指针是一个类的指针,并且类中包含有指针变量,则内存被释放后(对于C++类,通常是执行delete操作),类中的指针变量就会被赋值为0xfeeefeee。如果早调试代码过程中,发现有值为0xfeeefeee的指针,就说明对应的内存被释放掉了,我们的代码已经出问题了。


你可能感兴趣的:(C++)