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 时发生访问冲突