class B;
class A
{
private:
unsigned int x;
B *m_pParent;
public:
A(B* parent) : m_pParent(parent)
{
x = rand();
}
~A()
{
m_pParent->doCleanup();
}
unsigned int getSomeVariable()
{
return x;
}
}
class B
{
private:
A* m_pChild;
public:
B()
{
m_pChild = new A (this);
}
void doCleanup()
{
m_pChild->getSomeVariable();
}
}
总而言之,类A的析构函数中有一堆清理代码,其中之一是调用类B的函数,该类具有指向A的指针,以在B内的清理例程中使用A的某些变量get函数。
现在,我知道这不是很好的设计,但这是我必须使用的设计。我正在调查一些崩溃日志,看来这可能是导致崩溃的原因。可能是这种情况还是此代码安全?
该对象在两个类的范围之外均被销毁。
最佳答案
您的示例中A的析构函数是安全的。在析构函数返回之前,不会释放A的内存,因此m_pChild->getSomeVariable()
是可以的。
但是,您的真实代码可能会对A的析构函数进行额外的清理,从而在m_pParent->doCleanup()
之前销毁了A的成员。
例如,如果示例稍作更改,请执行以下操作:
A(B* parent) : m_pParent(parent)
{
x = new int(rand());
}
~A()
{
delete x;
m_pParent->doCleanup();
}
unsigned int getSomeVariable()
{
return *x;
}
现在,A的析构函数是不安全的,因为
getSomeVariable
被doCleanup
调用,而x
是此时的悬挂指针。没有更多信息,很难确切地说出是什么导致了您的崩溃。如果可能,我建议您在调试器中查看。它应该显示出崩溃的确切位置。
编辑:您也可以使用Valgrind在Linux上查找内存错误,并且Windows具有可以启用的调试堆检查。
关于c++ - 此代码安全吗?从被销毁的类中调用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28648012/