【问题标题】:C++ Access violation reading location 0xcdcdcdcd error on calling a functionC ++访问冲突读取位置0xcdcdcdcd调用函数时出错
【发布时间】:2013-08-01 12:06:10
【问题描述】:

请考虑以下情况:

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

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

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

提前致谢。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    ptr = new myClass();

    这样就可以了。但是在这种情况下你根本不必使用指针。

    【讨论】:

    • 不是“调用空内存”,而是“引发未定义的行为”。
    • @John 您能否详细说明“引发未定义的行为”是什么意思?
    【解决方案3】:

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

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

    在此处了解更多信息:

    Troubleshooting Common Problems with Applications: Debugging in the Real World

    Win32 Debug CRT Heap Internals

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        我可以看到星星。
        这可以代替吗?

        class sampleClass
        {
        
          .....
          .....
          myClass ptr;
        };
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-12
          相关资源
          最近更新 更多