【问题标题】:C++ - when are non-pointers class member destroyed?C++ - 非指针类成员何时被销毁?
【发布时间】:2009-10-06 10:19:41
【问题描述】:

假设我有这个代码...

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_ 映射到达析构函数时,我得到了无效值。断点表明该值不会篡改存储在 QMap 中的值。

【问题讨论】:

  • 你应该总是预先增加迭代器:++itr。对于整数和更简单类型的迭代器(如 vector)并不重要,但由于 ++ 工作方式的不同,它可能会降低复杂迭代器的性能。

标签: c++ destructor


【解决方案1】:

它会在析构代码被执行后被销毁

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-23
        • 2018-05-02
        • 2010-11-02
        • 1970-01-01
        • 2013-05-24
        • 2018-03-24
        • 1970-01-01
        • 2012-02-13
        相关资源
        最近更新 更多