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

时间:2013-08-01 12:06:11

标签: c++ visual-c++ exception

请考虑以下情况:

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

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

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

提前致谢。

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

ptr = new myClass();

这样做。但是在这种情况下你根本不必使用指针。

答案 2 :(得分:1)

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

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

在这里阅读更多相关信息:

<强> Troubleshooting Common Problems with Applications: Debugging in the Real World

<强> Win32 Debug CRT Heap Internals

答案 3 :(得分:1)

为了解决它(一种可能的方式),你必须让'ptr'实际上指向一个存在myClass对象的地址。为了存在,你必须创建它,例如

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

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

答案 4 :(得分:0)

我可以看到星星。
这有用吗?

class sampleClass
{

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

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