2015-08-24 191 views
1

我的程序崩潰,然後一個字符串對象被刪除,我想因爲我使用的是針對VS 2010編譯的oracle庫,而我正在使用VS 2015.下面是它崩潰的那一行:強制複製構造函數而不是移動構造函數

string f1 = cObj.getString(MetaData::ATTR_NAME); 

我得到一個正常的字符串,我可以使用它,但是當它超出範圍崩潰試圖解除分配。 現在,在閱讀關於使用舊版本的DLL時,我發現如果分配發生在該庫內,我們應該始終將內存釋放分配給DLL。我想這裏發生的是move構造函數get的調用,所以最後它試圖釋放由oracle dll分配的內存的字符串。

所以我的問題是,有沒有一種方法可以在這種情況下顯式調用字符串的複製構造函數?

+1

可能的CRT不匹配 –

+0

如果明確使用賦值,它是否工作?如果不是,你的問題可能會在別處。 –

+2

你可以用'string f1 = const_cast (cObj.getString(MetaData :: ATTR_NAME);'強制拷貝構造函數;'但是我懷疑這樣可以修復你的版本不匹配的問題 – nwp

回答

2

可執行文件和鏈接的DLL必須是二進制兼容的。通常他們需要由同一個編譯器生成。有時候不同的編譯器版本會使用相同的ABI,它可以繼續工作,但不適用於您的情況。

ABI定義瞭如何分配和釋放內存以及DLL和可執行文件對如何工作和因此崩潰有不同的假設。

有不同的方法來解決這個問題,從良好的分揀壞:

  1. 製作的版本同意升級DLL
  2. 製作的版本一致通過降級可執行
  3. 編寫一個包裝在正確的版本中通過套接字或管道暴露功能
  4. 請勿使用返回帶動態內存對象的函數
  5. 內存泄漏

在Visual Studio的情況下,你可以安裝在舊的和Visual Studio的新版本,去Solution ExplorerConfiguration PropertiesGeneralPlatform Toolsetselect the old platform在新版本中。

請注意,降級目標平臺會導致新功能不可用。

+0

謝謝你的回答:) – Silencer