我遇到了一个奇怪的问题,我曾经在运行时收到异常消息:
Unhandled exception at 0x0137d451 in I2cTlmTest.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.
我在创建对象“C”期间收到此消息。我已经对其进行了调试,但无法做太多事情,因为一旦调试到达class 函数中this
的断点,(指针)变量(和指针)的值就会设置为 (0xcdcdcdcd) 。我环顾四周寻找可能的罪魁祸首,认为变量可能未初始化或可能在我到达函数之前被删除。但是在函数中,当我进入函数并设置为魔法值时,所有变量都被初始化并消失。B::getHelper
B
A::getHelper
B::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;
}