3

请考虑以下场景:

我有一个头文件及其对应的源文件:

exmp.h(头文件)

exmp.cpp(源文件)

在头文件中,我有一个函数声明bubSort(...),其定义存在于

例子.cpp

myClass::bubSort(...)
{

....
....

}

其中,myClass->exmp.h中定义的类

现在为了bubSort(...)在另一个文件Sample.cpp中使用该函数,我myClassSample.h中声明了如下所示:

/*Sample.h*/
class myClass;

class sampleClass
{

  .....
  .....
  myClass *ptr;
};

现在使用上面的ptr,我试图bubSort(...)在 Sample.cpp 中访问,如下所示:

//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
     ....
     ....
     ptr->bubSort(...);
}

上面的场景在编译期间没有给出任何错误,但是在执行时,当控件到达时ptr->bubSort(...);,我得到一个异常:

访问冲突读取位置 0xcdcdcdcd

有人能告诉我如何避免这种情况吗?

提前致谢。

4

5 回答 5

6

ptr是指向 a 的指针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();
}
于 2013-08-01T12:08:39.770 回答
1

您没有初始化指针,因此您调用的是空内存。由于可视化调试器,它是 0xcdcdcdcd 而不是一些随机的东西。

ptr = new myClass();

这会做。但是在这种情况下,您根本不必使用指针。

于 2013-08-01T12:10:07.273 回答
1

0xcdcdcdcd表示未初始化的数据。

这意味着您正试图在某处访问未初始化的指针。

在此处阅读更多信息:

解决应用程序的常见问题:在现实世界中进行调试

Win32 调试 CRT 堆内部

于 2013-08-01T12:10:22.807 回答
1

为了解决它(一种可能的方法),您必须使“ptr”实际上指向存在 myClass 对象的地址。为了存在,您必须创建它,例如

class sampleClass
{
public:
   sampleClass()
   {
       ptr = new myClass();
   }
private:
   myClass* ptr;
};

不过,您可能仍会考虑使用 C++11 的 unique_ptr 或 shared_ptr 而不是原始指针。

于 2013-08-01T12:13:40.873 回答
0

我可以看到星星。
这会起作用吗?

class sampleClass
{

  .....
  .....
  myClass ptr;
};

除非您知道自己在做什么,否则不要使用指针。

于 2013-08-01T12:12:42.117 回答