我遇到了一个奇怪的问题,我曾经在运行时获得一个异常,并带有以下信息:
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;
}
答案 0 :(得分:1)
helper_未指向有效地址。
您可以这样做:
B(A *ptr):ptrA_(ptr){ helper_ = new Helper(); }