2009-08-06 51 views
3

在生成Windows DLL動態庫時,系統會要求您聲明應導出哪些函數,以便某些函數可能被私人保存​​到DLL中,並且其他應用程序無法訪問。應該在Windows DLL庫中導出析構函數嗎?

我還沒有看到任何關於是否需要導出析構函數或者是否由編譯器或Windows內核自動處理的內容?如果我不導出析構函數,並且他們動態地分配一個我聲明爲可導出的類,如果析構函數未導出,它們是否可以成功調用delete?

回答

6

一般來說,任何具有構造函數的類都應該導出析構函數。

話雖這麼說,有一對夫婦的事情要警惕這裏...

如果你在Windows上構建,你需要小心使用庫混合VS版本。如果你只是將你的庫作爲一個DLL來分發,那麼導出構造函數和析構函數是一個壞主意。問題出在C++運行時。需要處理內存分配的相同運行時需要處理釋放。例如,當您嘗試在VS2008中使用在VS2005中編譯的庫時,就會發生這種「不好的事情」的頭號原因。

解決方案是爲了提供工廠方法來創建類(分配由您編譯的運行時處理)以及刪除/毀壞類的方法(因此解除分配發生在同一運行時)。

+2

去工廠函數路由也打開了非C++程序使用DL​​L的可能性,我希望每個人都認爲這是一件好事。 – 2009-08-06 17:52:55

+0

好吧,所以一般來說,導出析構函數可能是一件壞事。我實際上正在計劃使用因子方法進行創造,所以我可能會繼續這樣做。同樣爲了清楚起見,你們能否解釋一下爲什麼它是如此糟糕的事情,以至於相同的運行時間解除分配和分配? – 2009-08-07 10:43:29

+0

@IQ:如果VC2005運行時刪除VC2008運行時分配的內容,則可以(偶爾也很難跟蹤)導致內存損壞,崩潰等問題的錯誤。保持運行時一致可以防止出現這種情況。 – 2009-08-07 16:46:17

4

如果析構函數不可用但需要,編譯器應該生成一個錯誤。作爲一般規則,如果你的構造函數被導出,你的析構函數也應該是。

相關問題