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的析构函数是不安全的,因为getSomeVariabledoCleanup调用,而x是此时的悬挂指针。

没有更多信息,很难确切地说出是什么导致了您的崩溃。如果可能,我建议您在调试器中查看。它应该显示出崩溃的确切位置。

编辑:您也可以使用Valgrind在Linux上查找内存错误,并且Windows具有可以启用的调试堆检查。

关于c++ - 此代码安全吗?从被销毁的类中调用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28648012/

10-11 22:07
查看更多