2016-07-27 65 views
1

在我的項目中,我有一些插件在運行時通過LoadLibrary()加載。從書籍「Windows via C/C++」我知道在DLL內部創建的對象應該在DLL內部釋放。 Object* CreateObj()void FreeObj(Object*)。原因是,可能有多個鏈接到正在運行的進程的鏈接的C/C++運行時。在Linux上分開堆?

當我嘗試將我的項目移植到Linux時,我使用了相同的方法。但是:Linux也需要這個嗎? Linux流程中有多個堆可能嗎?

+0

請注意,即使不是絕對必要的,它仍然被認爲是提供「FreeObj」的明確風格。它使正確使用庫變得更容易。考慮例如'免費'與'刪除'... – Zulan

+0

我不確定提出的重複是不錯的選擇,因爲當前的問題是關於C++運行時,而不是關於標準C函數。很少C++運行時可以在內部使用相同的'malloc()'(和進程堆),但保持分離狀態而不可互換'new/delete'。將此問題標記爲重複可能會導致新讀者恕我直言的誤解。 – Sergio

回答

1

如果您.so靜態鏈接到C++運行時 - 你應該因爲new/delete在那裏他們被分配在同一模塊中釋放的對象是東西比malloc()/free()越來越需要一些額外的信息才能正常工作。此外,因爲通常可以將模塊鏈接到不同的和二進制不兼容的運行時實現(例如,您有一些第三方預構建模塊),所以您甚至不應該將運行時特定的對象/指針傳遞給.so模塊中的對象(例如std::string)。即使您在所有進程中使用相同的運行時實現 - 靜態鏈接導致創建運行時內部全局變量的多個實例,這肯定會造成混亂。

因此,恕我直言,最好的方案 - 是將所有模塊與運行時的動態版本鏈接起來。或者,如果您真的想要使用靜態鏈接運行時 - 您必須爲每個模塊公開純C接口,以避免上述干擾。

P.S.這種行爲並不取決於實際的系統,它與支持動態加載模塊的任何事物有關。