C0000005: 读取位置 0xCCCCCCCC 时发生访问冲突

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C0000005: 读取位置 0xCCCCCCCC 时发生访问冲突相关的知识,希望对你有一定的参考价值。

原应用程序使用VS2008(中文专业版)编译运行,正常使用。现为升级开发环境,使用VS2013(中文专业版)编译运行,编译通过,但是运行提示错误,调试出现错误信息:0x0FF008D8 (msvcr120d.dll) (XXX.exe 中)处有未经处理的异常: 0xC0000005: 读取位置 0xCCCCCCCC 时发生访问冲突。程序本身应该没什么问题,毕竟VS2008编译正常运行多年,无此类问题,现在使用VS2013编译通过运行无法正常使用,可能由于环境或参数设置问题,但是由于自身能力有限,特此网上求教各路大神~

不知道你是编写C++还是C#程序,也没有出错位置源代码,因此无法确认具体错误细节,但是从出错信息看,程序访问的对象为无效地址。

如果是C++应该是访问了非法指针,也就是野指针,指针没初始化,并且没有进行指针有效性判断。如果是C#,应该是访问的对象为null,没创建对象。

其实两者实质都是一样,因为编译器对于没有初始化的变量,每个字节都会自动填充0xCC,这是机器语言中的中断指令,为的就是阻止非法访问。

用查找工具查找所有指针定义和对象定义。追问

谢谢指导,此程序是C++代码,没有放上代码主要是关联程序和动态库较多,至于您说的可能是野指针的情况,这个我从网上也查询过,只是VS2008编译运行且一直正常,由此可见应该不是代码本身出错,毕竟如果真是访问野指针等程序本身错误的话,VS2008就算编译通过,也不可能一直运行没问题,这个问题也只是在VS2013编译通过后,运行出错,调试时才发现的问题报错问题~

追答

不要相信编译器,不同编译器自动处理不同(隐含转换/处理),代码肯定存在BUG。只是之前的编译器编译结果不同没有触发而已,这种问题最难查,所以涉及到指针和引用,要养成好习惯,我在编写C++时,无论什么情况,遇到可能存在内存泄露的地方都必须显式处理(new 创建的内存块),养成如下习惯:

//定义指针
int *p=null;
//访问指针
if (p).......
//函数结束必须释放指针
if (p)

   delete []p;//假设是数组
   p=null;

 

当然你的问题还有一种情况就是数组越界。

追问

谢谢给予的解答~

参考技术A 数组越界了。sizeof(initdsp)
initdsp这个数组里面有两个指针,每个指针大小是4个字节,所以i<8,你应该改成i<sizeof(initdsp)/sizeof(char*)

Objective C - Parse.com 保存和读取地理位置 IOS

【中文标题】Objective C - Parse.com 保存和读取地理位置 IOS【英文标题】:Objective C - Parse.com Save and Read Geolocation IOS 【发布时间】:2013-11-24 22:04:08 【问题描述】:

我想从 Parse 数据库中读取地理位置并在地图中显示其他用户的位置。

我将位置写入解析数据库:

 [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) 
    if (!error) 




       [[PFUser currentUser] setObject:geoPoint forKey:@"currentLocation"];
        [[PFUser currentUser] saveInBackground];

然后我阅读了用户名和位置

     PFQuery *User = [PFUser query];
    [User selectKeys:@[@"username"]];
    [User findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) 


        Name = results;


              ];

    PFQuery *Location = [PFUser query];
    [Location   selectKeys:@[@"currentLocation",]];
    [Location findObjectsInBackgroundWithBlock:^(NSArray *location, NSError *error)
     


        Coordinaten = location;

 ];




    NSLog(@" %@ hat die %@",Name , Coordinaten);
   // ann.title = [Name objectAtIndex:1] ;
   // ann.coordinate = [[Coordinaten objectAtIndex:1] coordinate];
  //  [MapView addAnnotation:ann];

第一个问题是,NSLog 什么都不显示。当我在 Coordinaten = Location 下复制 NSLog 时,它们只显示 Coordinaten 的值。在 Name = results 下只有 Names 。

NSArray Coordinaten / 名称在 .h 中减速

接下来是,我如何用这些 NSArrays 设置标题和坐标

 // ann.title = [Name objectAtIndex:1] ;
   // ann.coordinate = [[Coordinaten objectAtIndex:1] coordinate];
  //  [MapView addAnnotation:ann];

谢谢!

【问题讨论】:

【参考方案1】:

这又是一个不了解异步编程本质的案例。

考虑这种情况:

你想做一个鸡蛋三明治。你把鸡蛋煮沸,并在它们煮熟的时候设置一个闹钟,把它们拿出来,剥皮,切碎,然后把它们加到你的三明治里。当你等待时,你得到面包和黄油,然后等待警报响起。

您对findObjectsInBackgroundWithBlock 的呼叫正在将鸡蛋煮沸。你通过的方块是警报,以及你打算如何处理煮熟的鸡蛋。

您上面的代码类似于将鸡蛋煮沸,然后立即尝试在三明治上使用未煮熟/半煮熟的鸡蛋。到那时,他们可能已经煮熟了,也可能煮得不够熟。通常它会造成很大的混乱。

一种解决方案是在您传递给方法的块末尾调用方法。

【讨论】:

这真是一个很棒的答案,我想知道为什么它没有得到更多的关注。这确实是异步编程的一个很好的例子。

以上是关于C0000005: 读取位置 0xCCCCCCCC 时发生访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

访问冲突写入位置 0xcccccccc

c++中的 0x004114a4 处有未经处理的异常: 0xC0000005: 写入位置 0xcccccccc 时发生访

在Project48.exe中的0x7B639D4E (ucrtbased.dll)处抛出异常:0xC0000005。访问违规写入位置 0xCCCCCCCC

VC++ 中的异常错误 c0000005

访问 ccomptr 指针和应用程序崩溃时访问冲突(c 系统异常代码:c0000005)

为啥即使在调试版本中,VS 和 Windbg 也会将“this”指针打印为“0xcccccccc”?