我正在尝试解决由于对正在被破坏的对象调用方法而导致我的应用程序崩溃的问题。我有以下课程:
// Forward declarations
class A;
class B
{
public:
B(A* aPtr) : m_pA(aPtr) { Schedule(); }
~B() { Timer::ref().Cancel(m_TimerId); }
void Schedule();
void Update();
private:
A* m_pA;
int32_t m_TimerId;
}
void B::Schedule()
{
m_TimerId = Timer::ref().Schedule(1000, [this]() { Update(); });
}
void B::Update()
{
m_pA->DoSomething();
}
class A
{
public:
void Create() { m_B = std::make_unique<B>(); }
void DoSomething() {}
private:
std::unique_ptr<B> m_B;
}
基本上,A 类持有unique_ptr
B 类,它将原始 ptr 存储到 A。B 使用 Timer 的单例实例,它在不同的线程中运行,它安排函数 B::Update() 每 1000 毫秒在该线程上执行一次。有时,当我销毁A
作为成员变量存储在堆栈上的对象时,它A
被销毁了,但是在 class 中有一个指向它的悬空指针B
,这会导致从另一个线程调用的函数B::Update()
使应用程序崩溃,因为 m_pA* 不是nullptr
,所以这会导致未定义的行为。
我应该如何处理,以防止我的应用程序崩溃?将明确设置m_pA = nullptr
;B::~B()
足够了吗?