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

标签 c++ visual-c++ exception

请考虑以下场景:

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

exmp.h(头文件)

exmp.cpp(源文件)

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

exmp.cpp

myClass::bubSort(...)
{

....
....

}

其中,myClass->是定义在exmp.h

中的类

现在为了在另一个文件 Sample.cpp 中使用函数 bubSort(...),我在 myClass 中声明了 < strong>Sample.h如下图:

/*Sample.h*/
class myClass;

class sampleClass
{

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

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

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

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

Access violation reading location 0xcdcdcdcd

谁能告诉我如何避免这种情况?

提前致谢。

最佳答案

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

关于C++访问冲突读取位置0xcdcdcdcd调用函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17993591/

相关文章:

c++ - const_cast<> 的正确用法

c++ - opencv中 vector 的概念到底是什么?

c++ - 使用 NiceMock 作为 GoogleMock 的实例变量

c++ - 自动引用类型

c++模板类成员struct初始化语法糖

java - 运行时异常无法启动 MainActivity

java - 异常(exception)情况

性能影响长双倍。为什么C选择默认的是64位而不是硬件的80位?

c++ - 为什么 VC++ 允许没有完整模板参数的模板类实例?

ruby - ruby 异常如何导致 mutices 解锁?