0xC0000005: 读取位置 xxx时发生访问冲突

  • Post author:
  • Post category:其他


解决参考:

https://www.kancloud.cn/wangshubo1989/pit/100967

最近编写代码遇到了这个错误导致程序崩溃,原因是访问了非法的地址

造成此问题出现的原因有:

1. 访问非法的内存地址

2.malloc 或者new 的空间没有释放,或者提前释放访问了野指针,或者访问了超出已开辟的空间地址大小

经过调试发现,Qt 的一个窗口提前释放内存了,所以指针变为野指针。

参考:


申请的内存没有释放


new后必须delete

malloc后必须free

创建内核对象(比如CreateFile,CreateMutex,CreateThread),后必须释放内核对象句柄.

创建内存映射文件,CreateFileMapping,MapViewOfFile后必须CloseHandle(),UnMapviewofFile

创建GDI对象后,比如LoadIcon,LoadImage,CreateImageList等等,必须Destroy掉

创建DC后,比如GetDC(), 必须释放DC句柄

保留虚拟地址空间 VirtualAlloc(),然后提交物理存储器后,必须释放掉


出现死循环导致内存泄露


所有的第三方类库存在内存泄露相关的BUG

常见的溢出主要有:


内存分配未成功,却使用了它。


常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p 是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc 或new 来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。


内存分配虽然成功,但是尚未初始化就引用它。


内存分配成功并且已经初始化,但操作越过了内存的边界。

例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for 循环语句中,循环次数很容易搞错,导致数组操作越界。


使用free 或delete 释放了内存后,没有将指针设置为NULL。导致产生“野指针”。

程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。

不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。



版权声明:本文为sunshine_505原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。