3

假设我有这个代码......

class GraphFactory : public QObject
{
private:
    QMap<QString, IGraphCreator*> factory_;

public:
    virtual ~GraphFactory();
};

GraphFactory::~GraphFactory()
{
    // Free up the graph creators
    QMap<QString, IGraphCreator*>::iterator itr;
    for (itr = factory_.begin(); itr != factory_.end(); itr++)
    {
        IGraphCreator * creator = itr.value();
        delete creator;
        creator = NULL;
    }

}

QMap factory_什么时候销毁?在调用析构函数之前,还是在析构函数期间?(我知道当 GraphFactory 的实例超出范围时将调用析构函数。但是非指针成员何时被销毁?)

编辑:当 factory_ map 到达析构函数时,我得到了无效的值。断点表明该值不会篡改存储在 QMap 中的值。

4

3 回答 3

11

析构代码执行会被销毁

这个想法是在析构函数代码中访问您的成员,以便它们在执行后被销毁。

于 2009-10-06T10:23:24.030 回答
2

之后GraphFactory::~GraphFactory,但之前QObject::~QObject。所以实际上在析构函数之间。

于 2009-10-06T10:24:57.350 回答
1

如果在调用析构函数时存储在 GraphFactory::factory_ 成员中的数据无效,有多种方式可能会发生这种情况,例如 GraphFactory 实例的双重释放,或者某些东西错误地覆盖了它。

如果您碰巧在 Windows 上运行,那么在调试此类问题时,诸如Application Verifier之类的工具会非常有用(使用它来启用 Page Heap 功能并在重现问题时附加调试器)。

如果在多线程环境中使用 GraphFactory 类,则应同步对 QMap 实例的访问,因为如果不这样做,可能会发生“坏事”。

我不知道其他平台的等效工具。如果有人读到这篇文章碰巧知道的话,我很想听听他们的消息。

于 2009-10-06T10:50:22.860 回答