假设我有这段代码......
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中存储的值。
答案 0 :(得分:11)
在析构函数代码执行后将被解析
我们的想法是在析构函数代码中访问您的成员,以便它们在执行后被销毁。
答案 1 :(得分:2)
GraphFactory::~GraphFactory
之后,QObject::~QObject
之前。实际上是在析构函数之间。
答案 2 :(得分:1)
如果在调用析构函数时存储在GraphFactory :: factory_成员中的数据无效,则可能会出现多种方式,例如:您的GraphFactory实例的双重释放,或者可能是错误地覆盖它。
如果您碰巧在Windows上运行,那么Application Verifier之类的工具在调试此类问题时非常有用(使用它来启用Page Heap功能并在重现问题时附加调试器)。
如果在多线程环境中使用GraphFactory类,则应该同步对QMap实例的访问,因为如果不这样做,可能会发生“坏事”。
我不知道其他平台的等效工具。如果有人读到这篇文章,我很想知道他们。