2010-09-25 57 views
2
c:\program files\microsoft visual studio 9.0\vc\include\result.h(212) : warning C4275: non dll-interface class 'std::_Container_base_aux' used as base for dll-interface class 'std::_Container_base_aux_alloc_real<_Alloc>' 
1>  with 
1>  [ 
1>   _Alloc=std::allocator<mysqlpp::Row> 
1>  ] 
1>  C:\Program Files\Microsoft Visual Studio 9.0\VC\include\xutility(377) : see declaration of 'std::_Container_base_aux' 

這可能是與容器相關的任何問題的原因,還是可以在Visual Studio 2008中安全地忽略它?我們可以忽略MySQL ++ C4275警告嗎?

回答

2

在這種情況下,我認爲這取決於std :: runtime_error。爲了讓客戶端使用這個類,它必須使用客戶端提供的定義,而不是DLL端。爲了成功,客戶端編譯器應該與DLL編譯器的版本完全相同。

除了類定義不能跨模塊邊界移植的事實之外,還有內存所有權要考慮。

如果您從具有類似std :: string的內部變量的類派生出來,那將是一場等待發生的災難。如果dll會使用另一個類從中導出的另一個運行時,則可能發生以下情況:

  • Base使用文本值初始化字符串。
  • 派生會嘗試更改字符串。
  • 它會嘗試釋放字符串的堆內存。

這當然不限於字符串。這只是一個例子。任何情況下,1運行時分配的東西,另一個釋放它會導致崩潰。

堆內存由基類使用的運行時所擁有。派生類的Thr運行時試圖釋放它 - >即時崩潰。爲了給你一個使用相同C++編譯器編譯的dll,並使用相同的運行時,你將受到dll提供者的支配。這是一個維護噩夢。

DLL類接口無疑是有史以來最糟糕的想法。只有2

的豁免是:

  • 使用DCOM(或純抽象類,這是相同的想法)
  • 你在整個碼樹的控制。例如,dll和exe是在同一個解決方案中構建的。

在所有其他情況下,DLL類接口支持惡夢和等待發生的災難。

我認爲this thread 可能會建議你一個解決方案。

如果使用相同的編譯器編譯所有內容並使用/MD,那麼可以忽略C4275,因此所有模塊共享相同的運行時。

相關問題