C++编程之0xC0000005读取位置xxx时发生访问冲突

  • 前言:在编程时,我们会经常遇到各种怀疑人生的问题,最近在重构原来代码的时候遇到了一个运行时:报错0xC0000005:读取位置xxx时发生访问冲突

1. 0xC0000005可能出现的原因

  • 是否访问的内存地址为空指针
  • 是否使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针”
  • 是否出现访问数组越界,malloc一个100内存的空间用于读入文件,当文件的大小超过100时,并且程序中再使用100之后的内存时,就会产生“0xC0000005: 读取位置 xxx时发生访问冲突”这样的错误。
  • 内存分配虽然成功,但是尚未初始化就引用它。
  • 然而这些都排查过了,依然没有任何头绪

2. 偶然发现的端倪

  • 在原有的工程中我有一个StructDefine.h的头文件,内容定义如下
      typedef struct __FrameHeader
      {
          long TimeStamp;
          long frameDuration;
          int FrameType;
          long FrameLen;
          int64_t FrameSynchronizationId;
      } FrameHeader;
    
    
      typedef struct __FrameInfo
      {
          FrameHeader frameHead;
          char* pdata;
      } FrameInfo;
    
  • 在我重构后的工程中,我新增了一个struct_define.h的头文件,内容定义如下
      typedef struct __FrameHeader
      {
          long TimeStamp;
          long frameDuration;
          int FrameType;
          long FrameLen;
          int64_t FrameSynchronizationId;
          int FrameBracketNum; ///
      } FrameHeader;
    
    
      typedef struct __FrameInfo
      {
          FrameHeader frameHead;
          char* pdata;
      } FrameInfo;
    
  • 两个结构体的定义名称是一样的,在重构后的工程中,我加入了int类型的FrameBracketNum变量,在使用过程中我在一些类中中引用了StructDefine.h文件,在一些类中中引用了struct_define.h,编译时没有出错。但是在运行过程中,由于定义的内容有差别,所以出现了0xC0000005:读取位置xxx时发生访问冲突的问题。

3. 个人总结

  • 编程中难免会遇到各种各样的问题,自己挖的坑,或者是别人挖的坑,但是填的坑多了,你就是下一个大神。

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