2009-10-06 27 views
3

假設我有這樣的代碼......C++ - 什麼時候非指針類成員被銷燬?

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中存儲的值。

+3

你應該總是預先增加迭代器:++ itr。對於整數和更簡單的迭代器來說,無關緊要,就像vector <>一樣,但由於++的工作方式不同,它可能成爲複雜迭代器的性能瓶頸。 – 2009-10-06 10:23:36

回答

11

它會遭到破壞析構函數代碼之後被執行

的想法是能夠訪問你的成員在析構函數的代碼,以便他們使它運行起來後,被摧毀。

2

之後GraphFactory::~GraphFactory,但在QObject::~QObject之前。所以實際上在析構函數之間。

1

如果存儲在GraphFactory :: factory_ member中的數據在調用析構函數時無效,那麼可能會發生多種方式,例如,雙免費的GraphFactory實例,或者可能是錯誤覆蓋它。

如果您碰巧在Windows上運行,那麼在調試此類問題時(使用它來啓用Page Heap功能並在再現問題時附加調試器),Application Verifier等工具可能非常有用。

如果在多線程環境中使用您的GraphFactory類,您應該同步對QMap實例的訪問,因爲如果不這樣,就會發生「壞事」。

我不知道其他平臺的等效工具。如果有人閱讀這篇文章,我很樂意聽到他們的消息。