C++ C++;调用函数时访问冲突读取位置0xCDCD错误 请考虑下面的情景:
我有一个头文件及其相应的源文件: exmp.h(头文件) exmp.cpp(源文件) 在头文件中,我有一个函数声明C++ C++;调用函数时访问冲突读取位置0xCDCD错误 请考虑下面的情景:,c++,visual-c++,exception,C++,Visual C++,Exception,我有一个头文件及其相应的源文件: exmp.h(头文件) exmp.cpp(源文件) 在头文件中,我有一个函数声明bubSort(…),其定义在 exmp.cpp myClass::bubSort(...) { .... .... } 其中,myClass->是在exmp.h 现在,为了在另一个文件Sample.cpp中使用函数bubSort(…),我在Sample.h中声明了myClass,如下所示: /*Sample.h*/ class myClass; class sampleCl
bubSort(…)
,其定义在
exmp.cpp
myClass::bubSort(...)
{
....
....
}
其中,myClass->
是在exmp.h
现在,为了在另一个文件Sample.cpp中使用函数bubSort(…)
,我在Sample.h中声明了myClass
,如下所示:
/*Sample.h*/
class myClass;
class sampleClass
{
.....
.....
myClass *ptr;
};
//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
....
....
ptr->bubSort(...);
}
现在使用上面的ptr
,我正在尝试访问Sample.cpp中的bubSort(…)
,如下所示:
/*Sample.h*/
class myClass;
class sampleClass
{
.....
.....
myClass *ptr;
};
//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
....
....
ptr->bubSort(...);
}
上面的场景在编译期间没有给出任何错误,但是在执行期间,当控件到达ptr->bubSort(…)时代码>,我得到一个异常:
访问冲突读取位置0xCDCD
有人能告诉我如何避免这种情况吗
提前感谢。ptr
是指向myClass
的指针,但您似乎从未初始化它。换句话说,ptr
没有指向任何东西。它是未初始化的--指向超空间
当您尝试使用此未初始化指针时
ptr->bubSort(...);
你会得到未定义的行为。实际上,你很幸运应用程序崩溃了,因为其他任何事情都可能发生。这似乎是可行的
要直接解决此问题,需要初始化ptr
。单向:
class sampleClass
{
public:
sampleClass()
:
ptr (new myClass)
{
}
};
(有关时髦的:
语法的解释,请查阅“初始化列表”)
但这使用了动态分配,这是最好避免的。最好避免动态分配的一个主要原因是,您必须记住删除您的任何内容,否则会泄漏内存:
class sampleClass
{
public:
~sampleClass()
{
delete ptr;
}
};
问问你自己,你是否真的需要一个指针,或者没有指针也行吗
class sampleClass
{
public:
myClass mMyClass;
};
sampleClass::func(...)
{
mMyClass.func();
}
您没有初始化指针,所以调用的是空内存。它是0xCDCDCD,而不是一些随机的东西,因为可视化调试器
ptr=新的myClass()
这就行了。但在这种情况下,您根本不必使用指针。0xcdcdcdcd
表示未初始化的数据
这意味着您正试图访问某个未初始化的指针
请在此处阅读更多信息:
我能看见星星。
这行吗
class sampleClass
{
.....
.....
myClass ptr;
};
除非您知道自己在做什么,否则不要使用指针。为了解决这个问题(一种可能的方法),您必须使“ptr”实际指向myClass对象所在的地址。为了生存,你必须创造它,例如
class sampleClass
{
public:
sampleClass()
{
ptr = new myClass();
}
private:
myClass* ptr;
};
您可能仍然考虑使用C++ 11的UNIQUYPPTR或SysDypPTR代替原始指针。
您是如何初始化<代码> PTR < /代码>的?这可能意味着您没有将<代码> PTR 指向任何东西。或者可能是别的什么。很难说,因为你还没有发布很多相关的代码。VC++中通常使用值<代码> 0xCD < /COD>标记未初始化的内存。<代码> 0xCDCDCDCD < /C> >:微软的C++调试运行时库使用它来标记未初始化的堆内存。有关特殊内存指针值的完整列表,请参阅。不是“调用空内存”,而是“调用未定义的行为”。@John能否详细说明“调用未定义的行为”的含义