C++ - 非指针类成员何时被销毁?

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工厂被销毁?在调用析构函数之前还是在析构函数期间?(我知道当GraphFactory实例超出作用域时,析构函数将被调用。但非指针成员何时被销毁?)
编辑:当QMap工厂到达析构函数时,我收到无效值。断点显示,该值不会影响存储在QMap中的值。

3
对于迭代器,应该始终使用预增运算符:++itr。对于整数和类似 vector<> 这样的简单迭代器来说没有太大关系,但对于复杂迭代器来说,由于 ++ 的工作方式不同,这可能会影响性能。 - Warren Young
3个回答

11

在析构函数代码执行完毕,它将被销毁。

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


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

1
如果在析构函数被调用时,GraphFactory::factory_ 成员中存储的数据无效,则可能有多种方式导致这种情况发生,例如 GraphFactory 实例的双重释放,或者某些错误地覆盖它。
如果您正在运行 Windows,则像 Application Verifier 这样的工具在调试此类问题时非常有帮助(使用它启用 Page Heap 功能,并在重现问题时附加调试器)。
如果您在多线程环境中使用 GraphFactory 类,则应同步访问 QMap 实例,因为如果不这样做,可能会发生“坏事”。
我不知道其他平台是否有等效的工具。如果阅读此文的任何人知道,请告诉我,我很想了解。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接