调用函数时C++访问冲突读取位置0xcdcdcdcd错误

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中使用该函数,我myClassSample.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

有人会告诉我怎么能避免这种情况吗?

提前致谢.

Joh*_*ing 6

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)