C ++访问冲突读取位置0xcdcdcdcd调用函数时出错

Posted

技术标签:

【中文标题】C ++访问冲突读取位置0xcdcdcdcd调用函数时出错【英文标题】:C++ Access violation reading location 0xcdcdcdcd error on calling a function 【发布时间】:2013-08-01 12:06:10 【问题描述】:

请考虑以下情况:

我有一个头文件及其对应的源文件:

exmp.h(头文件)

exmp.cpp(源文件)

在头文件中我有一个函数声明bubSort(...),其定义存在于

exmp.cpp

myClass::bubSort(...)


....
....


其中,myClass->exmp.h

中定义的类

现在为了在另一个文件Sample.cpp中使用函数bubSort(...),我在Sample.h中声明了myClass,如下所示:

/*Sample.h*/
class myClass;

class sampleClass


  .....
  .....
  myClass *ptr;
;

现在使用上面的ptr,我正在尝试访问Sample.cpp中的bubSort(...),如下所示:

//Sample.cpp
#include "exmp.h"
sampleClass::func(...)

     ....
     ....
     ptr->bubSort(...);

上面的场景在编译过程中没有报错,但是在执行过程中,当控件到达ptr->bubSort(...);时,出现异常:

访问冲突读取位置0xcdcdcdcd

谁能告诉我如何避免这种情况?

提前致谢。

【问题讨论】:

你是如何初始化ptr的? 这可能意味着你没有让ptr 指向任何东西。或者它可能是别的东西。很难说,因为您没有发布太多相关代码。 0xcd通常被VC++用来标记未初始化的内存。 0xCDCDCDCD :被微软的 C++ 调试运行时库用来标记未初始化的堆内存。有关特殊内存指针值的完整列表,请参阅 ***.com/questions/127386/…。 When and why will an OS initialise memory to 0xCD, 0xDD, etc. on malloc/free/new/delete?, In Visual Studio C++, what are the memory allocation representations? 【参考方案1】:

ptr 是指向myClass 的指针,但您似乎从未初始化它。换句话说,ptr 没有指向任何东西。它未初始化——指向超空间。

当你尝试使用这个未初始化的指针时,

ptr->bubSort(...);

你得到未定义的行为。您实际上很幸运应用程序崩溃了,因为其他任何事情都可能发生。它似乎可以工作。

要直接解决这个问题,需要初始化ptr。一种方式:

class sampleClass

public:
  sampleClass()
  :
    ptr (new myClass)
  
  
;

(有关时髦的: 语法的解释,请查看“初始化列表”)

但这使用动态分配,最好避免。最好避免动态分配的主要原因之一是因为你必须记住delete 任何你new,否则你会泄漏内存:

class sampleClass

public:
  ~sampleClass()
  
    delete ptr;
  
;

问问自己这里是否真的需要一个指针,或者不用指针就可以了?

class sampleClass

public:
  myClass mMyClass;
;

sampleClass::func(...)

  mMyClass.func();

【讨论】:

【参考方案2】:

你没有初始化指针,所以你调用的是空内存。它是 0xcdcdcdcd 而不是一些随机的东西,因为是可视化调试器。

ptr = new myClass();

这样就可以了。但是在这种情况下你根本不必使用指针。

【讨论】:

不是“调用空内存”,而是“引发未定义的行为”。 @John 您能否详细说明“引发未定义的行为”是什么意思?【参考方案3】:

0xcdcdcdcd 表示未初始化的数据。

这意味着您正试图在某处访问未初始化的指针。

在此处了解更多信息:

Troubleshooting Common Problems with Applications: Debugging in the Real World

Win32 Debug CRT Heap Internals

【讨论】:

【参考方案4】:

为了解决它(一种可能的方法),您必须使“ptr”实际上指向存在 myClass 对象的地址。为了存在,你必须创建它,例如

class sampleClass

public:
   sampleClass()
   
       ptr = new myClass();
   
private:
   myClass* ptr;
;

不过,您可能仍会考虑使用 C++11 的 unique_ptr 或 shared_ptr 而不是原始指针。

【讨论】:

【参考方案5】:

我可以看到星星。 这可以代替吗?

class sampleClass


  .....
  .....
  myClass ptr;
;

除非你知道自己在做什么,否则不要使用指针。

【讨论】:

以上是关于C ++访问冲突读取位置0xcdcdcdcd调用函数时出错的主要内容,如果未能解决你的问题,请参考以下文章

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

读取访问冲突 0xCDCDCDCD

C++ + OpenCV = 访问冲突读取位置 0x02176000

C++ 读取访问冲突,0xCDCDCDCD

访问dll方法时访问冲突读取位置

C ++中的openCV Mat访问冲突