這是我的問題。我正在製作C++ dll,它廣泛依賴於實例對象導出。 因此,我通過一些導出的工廠方法將我的實際實例作爲指向接口的指針返回。界面中的純虛擬析構器
我使用的接口純粹是虛擬的,以避免鏈接problame。所以我也需要一個純粹的虛擬析構函數,並且我實現了一個(空的主體,因爲我使用了它)。 所有編譯完好,除了...我看不到,如果實際的析構函數被調用或不 - 因爲當我添加一些
std::cout << "hello destructor";我永遠不會看到它。我有一些顯式的「刪除OBJ」(編輯:它是從DLL中的「FreeObject」方法調用),這不是問題。
我錯過了什麼?有另一種通過界面刪除我的對象的方法嗎?
編輯:再次,我沒有內存管理不一致,這一切都在DLL內。但是,正確的析構函數就不會啓動。
已經關心了這一點。 我編輯了我的問題清楚。 – ALOR 2010-06-15 03:38:15
我仍然建議使用COM AddRef/Release模式。 'FreeObject'聽起來像一個非常通用的名字,參數是如何定義的?刪除的指針必須至少具有編譯時類型,至少與聲明虛擬析構函數以便虛擬刪除發生的基類相同 - delete(void *)p將永遠不會調用p上的任何析構函數。 – 2010-06-15 03:42:33
10年前,當運行時只能作爲靜態庫使用時,使用新的/刪除跨dll bun烘乾是一個問題。這個問題是通過引入運行時DLL的共享lib版本解決的(這意味着整個應用程序只有一個堆)。除非你「手動」加載/卸載dll的使用新的/刪除跨DLL乾燥不再是一個問題。 – 2010-06-15 06:57:38