请考虑以下场景:
我有一个头文件及其对应的源文件:
exmp.h(头文件)
exmp.cpp(源文件)
在头文件中我有一个函数声明 bubSort(...)
其定义存在于
exmp.cpp
myClass::bubSort(...)
{
....
....
}
其中,myClass->
是定义在exmp.h
现在为了在另一个文件 Sample.cpp 中使用函数 bubSort(...)
,我在 myClass
中声明了 < strong>Sample.h如下图:
/*Sample.h*/
class myClass;
class sampleClass
{
.....
.....
myClass *ptr;
};
现在使用上面的 ptr
,我正在尝试访问 Sample.cpp 中的 bubSort(...)
,如下所示:
//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
....
....
ptr->bubSort(...);
}
上面的场景在编译期间没有给出任何错误,但是在执行时,当控件到达 ptr->bubSort(...);
时,我得到一个异常:
Access violation reading location 0xcdcdcdcd
谁能告诉我如何避免这种情况?
提前致谢。
最佳答案
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();
}
关于C++访问冲突读取位置0xcdcdcdcd调用函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17993591/