-1

我遇到了一个奇怪的问题,我曾经在运行时收到异常消息:
Unhandled exception at 0x0137d451 in I2cTlmTest.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.

我在创建对象“C”期间收到此消息。我已经对其进行了调试,但无法做太多事情,因为一旦调试到达class 函数中this的断点,(指针)变量(和指针)的值就会设置为 (0xcdcdcdcd) 。我环顾四周寻找可能的罪魁祸首,认为变量可能未初始化或可能在我到达函数之前被删除。但是在函数中,当我进入函数并设置为魔法值时,所有变量都被初始化并消失。B::getHelperBA::getHelperB::getHelper

经过一番调试后,我只是将默认内联A::getHelper移至 A.cpp。令我惊讶的是,我的应用程序开始运行。我已经解决了我的问题,但不知道为什么 inline 函数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;
}
4

1 回答 1

1

helper_ 未指向有效地址。

你可以这样做:

B(A *ptr):ptrA_(ptr){ helper_ = new Helper(); }
于 2013-11-07T17:59:07.353 回答