C ++ - 什么时候非指针类成员被破坏?

时间:2009-10-06 10:19:42

标签: c++ destructor

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

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的一个实例超出范围时会调用析构函数。但是什么时候非指针成员被销毁?)

编辑:当工厂地图到达析构函数时,我收到的值无效。断点显示该值不会篡改QMap中存储的值。

3 个答案:

答案 0 :(得分:11)

在析构函数代码执行后将被解析

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

如果在调用析构函数时存储在GraphFactory :: factory_成员中的数据无效,则可能会出现多种方式,例如:您的GraphFactory实例的双重释放,或者可能是错误地覆盖它。

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

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

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