2016-09-15 37 views
0

我知道,在C++中編寫(動態)插件時,插件分配的內存也應該由插件釋放。一般來說,這同樣適用於DLL。以下像QString這樣的類可以安全地跨DLL邊界傳輸,假設使用相同的編譯器?

假設:可執行文件,所有插件和所有的依賴關係(如QT)總是會以相同的編譯器構建

由於類,如QString使用機制,例如淺拷貝,因此內部數據指針:

如果插件通過(淺)副本返回本地定義的QString到可執行文件,並且副本超出了可執行文件的範圍,那麼是否會在錯誤的過程中釋放內存?

例如代碼:

// Defined in a DLL which is loaded at runtime 
class SamplePlugin : IPlugin 
{ 
public: 
    QString getSomeStringData() const override 
    { 
     return "Hello World" 
    } 
} 

// Defined in the executable 
void Test(PluginManager* pluginManager) 
{ 
    for(auto plugin : pluginManager->loadPlugins()) 
    { 
     auto stringData = plugin->getSomeStringData(); 
     doSomethingWith(stringData) 

    } // stringData goes out of scope here - is this a problem? 
} 

回答

3

一般而言,2周的Dll可共享的對象如果

  1. 通過一個分配的存儲器可以由其他安全地刪除(即它們共享相同的共享運行時[和任何其他相關庫])。

  2. 兩者中的代碼都使用相同的編譯器和兼容的編譯器選項編譯。

  3. 的對象不依賴於它是本地的共享庫的任何靜態或

  4. 的對象已經被標記DLLEXPORT /導入適當的。

請注意,即使上述所有得到滿足,並且在2名的dll依賴對象相同的靜態庫,你可能會得到問題(如果是靜態庫與全球聯動,如狀態靜態變量)。

相關問題