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



请考虑以下场景:

我有一个头文件和相应的源文件:

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;
};

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

最新更新