请考虑以下场景:
我有一个头文件和相应的源文件:
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
是指向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();
}
您没有初始化指针,所以您调用的是空内存。它是0xcdcdcdcd,而不是一些随机的东西,因为可视化调试器。
ptr=新myClass();
这样就可以了。但在这种情况下,您根本不必使用指针。
0xcdcdcdcd
表示未初始化的数据。
这意味着您正试图访问某个未初始化的指针。
点击此处阅读更多信息:
应用程序常见问题的疑难解答:在现实世界中调试
Win32调试CRT堆内部
为了解决它(一种可能的方法),您必须使"ptr"实际指向myClass对象所在的地址。为了存在,你必须创建它,例如
class sampleClass
{
public:
sampleClass()
{
ptr = new myClass();
}
private:
myClass* ptr;
};
不过,您可能仍然会考虑使用C++11的unique_ptr或shared_ptr来代替原始指针。
我能看到星星
这样行吗?
class sampleClass
{
.....
.....
myClass ptr;
};
除非你知道自己在做什么,否则不要使用指针。