我在處理現有庫時遇到了析構函數的奇怪用法。被分配stl向量的棧的析構函數被明確調用,當它的情況下該對象可能需要再次使用。這些矢量對象是具有專門的clear
方法的stl矢量類的稍微定製的版本。在析構函數體中存在兩個方法調用:clear()
,_Tidy()
。C++堆棧分配對象,顯式析構函數調用
我一直在想爲這個析構函數被調用的一個很好的理由,而不僅僅是clear
,但我不知所措。任何人都清楚爲什麼這可能是一個好主意?
我在處理現有庫時遇到了析構函數的奇怪用法。被分配stl向量的棧的析構函數被明確調用,當它的情況下該對象可能需要再次使用。這些矢量對象是具有專門的clear
方法的stl矢量類的稍微定製的版本。在析構函數體中存在兩個方法調用:clear()
,_Tidy()
。C++堆棧分配對象,顯式析構函數調用
我一直在想爲這個析構函數被調用的一個很好的理由,而不僅僅是clear
,但我不知所措。任何人都清楚爲什麼這可能是一個好主意?
這絕對不是一個好主意。析構函數開始運行後對對象的任何操作都會產生未定義的行爲。
也許最初的編碼人員關心內存分配對象的位置。
然後必須明確調用析構函數,按照this discussion。
這可能是這種情況,因爲討論是關於堆棧分配向量的。 – 2009-10-28 18:53:14
clear()不保證實際釋放向量中分配的存儲空間; MSVC實現中的_Tidy()實際上將釋放該存儲空間,所以這可能是作爲優化完成的。
這是一件很糟糕的事情,但只要存儲被相同類型的對象(忽略cv-qualifiers)重用存儲併合法地存儲所有的存儲空間,您就可以合法地執行此操作:
T automatic;
automatic.T::~T();
new (&automatic) T();
C++標準的第3.8.7節描述了這種使用場景並解釋了它是如何合法的;它甚至包括一個類似於上面的例子。
你能提供一個代碼示例,向量dtor的代碼示例,以及它如何被調用? – 2009-10-28 16:43:01
_Tidy()做了什麼? – Brian 2009-10-28 16:44:18
向我們展示矢量是如何創建的。 – sbi 2009-10-28 17:07:10