Я столкнулся со странной проблемой, когда я получал исключение во время выполнения с сообщением:
Unhandled exception at 0x0137d451 in I2cTlmTest.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.
Я получаю это сообщение при создании объекта «C». Я отладил его, но ничего не мог сделать, потому что значения переменных (указателя) (и this
указатель) устанавливаются в (0xcdcdcdcd), как только отладка достигает точки останова в B::getHelper
функция класса B
, Я искал возможных виновников, думая, что переменные не могут быть инициализированы или могут быть удалены до того, как я достигну функции. Но в A::getHelper
Функция все переменные инициализируются и исчезают, когда я вхожу в B::getHelper
функции и установлены магические значения.
После небольшой пробной отладки я просто переместил default-inline 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;
}
helper_ не указывает на действительный адрес.
Вы можете сделать что-то вроде этого:
B(A *ptr):ptrA_(ptr){ helper_ = new Helper(); }
Других решений пока нет …