内联函数:访问冲突读取位置0xcdcdcdd5?

时间:2013-11-07 17:49:42

标签: c++ inline access-violation one-definition-rule

我遇到了一个奇怪的问题,我曾经在运行时获得一个异常,并带有以下信息:
Unhandled exception at 0x0137d451 in I2cTlmTest.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.

我在创建对象'C'时收到此消息。我调试了它但是做不了多少因为调试到达this中的断点时,(指针)变量(和B::getHelper指针)的值被设置为(0xcdcdcdcd)类B的功能。我四处寻找可能的罪魁祸首,认为变量可能没有初始化,或者在我到达函数之前可能会被删除。但是在A::getHelper函数中,当我输入B::getHelper函数并且设置为魔术值时,所有变量都被初始化并消失。

经过一些试验调试后,我只是将默认内联A::getHelper移到了A.cpp。令我惊讶的是我的应用程序开始运行。我已经解决了我的问题,但不知道为什么A中的内联函数导致了问题。任何帮助都非常感谢。很抱歉这个问题很长,但没有其他选择。

我尝试使用以下代码片段创建一个类似的场景:

-----classA.h---------
#include"classB.h"

class A
{
public:
      // if the definition of `getHelper()` is moved to A.cpp runs fine. But, why ? 
  Helper* getHelper() const { return ptrB_->getHelper(); } 

  A()
  {
     ptrB_ = new B(this);
  }
private:
    B *ptrB_;
};

----classB.h-----------
class A;

class Helper
{
....
....
};
class B
{

public:
  B(A *ptr):ptrA_(ptr){ helper_ = new Helper(); }
  Helper* getHelper() const { return helper_; }
private:
  A *ptrA_;
  Helper *helper_;
};

-------classC.h--------

#include"classA.h"

class C
{
public:
  C(A &ref): refA_(ref)
  {
     helper_ = refA_.getHelper();
  }

private:
  Helper *helper_;
  A &refA_;
};

------main.cpp---------
#include"classC.h"

int main()
{
  A *ptrA = new A();
  C *ptrC = new C(*ptrA);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

helper_未指向有效地址。

您可以这样做:

B(A *ptr):ptrA_(ptr){ helper_ = new Helper(); }