Zax*_*Zax 3 c++ exception visual-c++
请考虑以下情况:
我有一个头文件及其相应的源文件:
exmp.h(头文件)
exmp.cpp(源文件)
在头文件中,我有一个函数声明,bubSort(...)其定义存在于
exmp.cpp
myClass::bubSort(...)
{
....
....
}
Run Code Online (Sandbox Code Playgroud)
其中,myClass->是exmp.h中定义的类
现在为了bubSort(...)在另一个文件Sample.cpp中使用该函数,我myClass在Sample.h中声明了如下所示:
/*Sample.h*/
class myClass;
class sampleClass
{
.....
.....
myClass *ptr;
};
Run Code Online (Sandbox Code Playgroud)
现在使用上面的内容ptr,我正在尝试访问bubSort(...)Sample.cpp,如下所示:
//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
....
....
ptr->bubSort(...);
}
Run Code Online (Sandbox Code Playgroud)
上面的场景在编译期间没有给出任何错误,但是在执行时,当控件到达时ptr->bubSort(...);,我得到一个异常:
访问冲突读取位置0xcdcdcdcd
有人会告诉我怎么能避免这种情况吗?
提前致谢.
ptr是一个指向a的指针myClass,但你似乎没有初始化它.换句话说,ptr并没有指向任何东西.它没有初始化 - 指向超空间.
当您尝试使用此未初始化的指针时,
ptr->bubSort(...);
Run Code Online (Sandbox Code Playgroud)
你得到未定义的行为.你真的很幸运,应用程序崩溃了,因为其他任何事情都可能发生.它本可以起作用.
要直接解决此问题,您需要初始化ptr.单程:
class sampleClass
{
public:
sampleClass()
:
ptr (new myClass)
{
}
};
Run Code Online (Sandbox Code Playgroud)
(有关时髦:语法的解释,请查看"初始化列表")
但这使用动态分配,最好避免.最好避免动态分配的一个主要原因是因为你必须记住delete任何事情new,否则你会泄漏内存:
class sampleClass
{
public:
~sampleClass()
{
delete ptr;
}
};
Run Code Online (Sandbox Code Playgroud)
问问自己你是否真的需要一个指针,或者做得不好?
class sampleClass
{
public:
myClass mMyClass;
};
sampleClass::func(...)
{
mMyClass.func();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25548 次 |
| 最近记录: |