请考虑以下情况:
我有一个头文件及其相应的源文件:
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
有人会告诉我如何避免这种情况吗?
提前致谢。
答案 0 :(得分:6)
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();
}
答案 1 :(得分:1)
您没有初始化指针,因此您正在调用空内存。由于可视调试器,它是0xcdcdcdcd而不是一些随机的东西。
ptr = new myClass();
这样做。但是在这种情况下你根本不必使用指针。
答案 2 :(得分:1)
0xcdcdcdcd
表示未初始化的数据。
这意味着您正试图在某处访问未初始化的指针。
在这里阅读更多相关信息:
<强> Troubleshooting Common Problems with Applications: Debugging in the Real World 强>
答案 3 :(得分:1)
为了解决它(一种可能的方式),你必须让'ptr'实际上指向一个存在myClass对象的地址。为了存在,你必须创建它,例如
class sampleClass
{
public:
sampleClass()
{
ptr = new myClass();
}
private:
myClass* ptr;
};
你可能仍然会考虑使用C ++ 11的unique_ptr或shared_ptr而不是原始指针。
答案 4 :(得分:0)
我可以看到星星。
这有用吗?
class sampleClass
{
.....
.....
myClass ptr;
};
除非你知道自己在做什么,否则不要使用指针。