Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;调用函数时访问冲突读取位置0xCDCD错误 请考虑下面的情景:_C++_Visual C++_Exception - Fatal编程技术网

C++ C++;调用函数时访问冲突读取位置0xCDCD错误 请考虑下面的情景:

C++ C++;调用函数时访问冲突读取位置0xCDCD错误 请考虑下面的情景:,c++,visual-c++,exception,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 sampleCl

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

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;
};
//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
     ....
     ....
     ptr->bubSort(...);
}
现在使用上面的
ptr
,我正在尝试访问Sample.cpp中的
bubSort(…)
,如下所示:

/*Sample.h*/
class myClass;

class sampleClass
{

  .....
  .....
  myClass *ptr;
};
//Sample.cpp
#include "exmp.h"
sampleClass::func(...)
{
     ....
     ....
     ptr->bubSort(...);
}
上面的场景在编译期间没有给出任何错误,但是在执行期间,当控件到达
ptr->bubSort(…)时,我得到一个异常:

访问冲突读取位置0xCDCD

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


提前感谢。

ptr
是指向
myClass
的指针,但您似乎从未初始化它。换句话说,
ptr
没有指向任何东西。它是未初始化的--指向超空间

当您尝试使用此未初始化指针时

ptr->bubSort(...);
你会得到未定义的行为。实际上,你很幸运应用程序崩溃了,因为其他任何事情都可能发生。这似乎是可行的

要直接解决此问题,需要初始化
ptr
。单向:

class sampleClass
{
public:
  sampleClass()
  :
    ptr (new myClass)
  {
  }
};
(有关时髦的
语法的解释,请查阅“初始化列表”)

但这使用了动态分配,这是最好避免的。最好避免动态分配的一个主要原因是,您必须记住删除您的任何内容,否则会泄漏内存:

class sampleClass
{
public:
  ~sampleClass()
  {
    delete ptr;
  }
};
问问你自己,你是否真的需要一个指针,或者没有指针也行吗

class sampleClass
{
public:
  myClass mMyClass;
};

sampleClass::func(...)
{
  mMyClass.func();
}

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

ptr=新的myClass()


这就行了。但在这种情况下,您根本不必使用指针。

0xcdcdcdcd
表示未初始化的数据

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

请在此处阅读更多信息:

我能看见星星。
这行吗

class sampleClass
{

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

为了解决这个问题(一种可能的方法),您必须使“ptr”实际指向myClass对象所在的地址。为了生存,你必须创造它,例如

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

您可能仍然考虑使用C++ 11的UNIQUYPPTR或SysDypPTR代替原始指针。

您是如何初始化<代码> PTR < /代码>的?这可能意味着您没有将<代码> PTR 指向任何东西。或者可能是别的什么。很难说,因为你还没有发布很多相关的代码。VC++中通常使用值<代码> 0xCD < /COD>标记未初始化的内存。<代码> 0xCDCDCDCD < /C> >:微软的C++调试运行时库使用它来标记未初始化的堆内存。有关特殊内存指针值的完整列表,请参阅。不是“调用空内存”,而是“调用未定义的行为”。@John能否详细说明“调用未定义的行为”的含义