2011-12-09 68 views
2

這是「著名的」/VD2在Visual Studio中的錯誤的詳細信息,例: http://mcdougalljonathan.blogspot.com/2011/12/visual-c-2010-stdistringstream-crash-in.html 或谷歌爲「Visual Studio的VD2 gtkmm的」關鍵詞..我該如何解決這個Visual Studio編譯器BUG?

所以我不得不產生一個代碼發行版VS2010下面有很多這樣的模式。看起來不可能,我還剩10天。任何想法?

#include <iostream> 
#include <sstream> 

struct Object 
{ 
    virtual ~Object() {} 
}; 

struct Base: virtual public Object 
{ 
    Base() :Object() 
    { 
    // upcast and downcast 
    Object* o = static_cast<Object*>(this); 
    Base* b = dynamic_cast<Base*>(o); 
    std::cout << " this: " << this << " after cast: " << b; 
    // should be the same address 
    if (this != b) 
     std::cout << " check address: NOK"; 
    else 
     std::cout << " check address: OK "; 
    } 
}; 

struct Derived: public Base 
{ 
    int i; 
}; 

int main() 
{ 
    Derived d; 
    std::cout << " end arrived: "; 
    std::stringstream* ss = new std::stringstream; 
    delete ss; 
    std::cout << "OK"; 
} 

編輯

我有一個想法......所以,我想每一個的std ::流替換到包裝,爲前。 std2 :: stream,在那裏我動態地將它們分配給一個智能ptr,並且我編譯了不包含/ vd2開關的包裝器實現。我會嘗試在第二天...

所以我想是這樣的

// compile without /vd2 
#include <sstream> 
#include <iostream> 
#include <boost/scoped_ptr.hpp> 

namespace std2 
{ 
    class stringstream 
    { 
     public: 
      stringstream() 
      { 
       m_stream.reset(new std::stringstream); 
      } 
      template<typename T> 
      std::stringstream& operator<<(const T& param) 
      { 
       *m_stream << param; 
       return *m_stream; 
      } 

      std::string str() const 
      { return m_stream->str(); } 
     private: 
      boost::scoped_ptr<std::stringstream> m_stream; 

    }; 
} 

int main() 
{ 
    std2::stringstream stream; 
    stream << "DDDD" << std::endl; 
    std::cout << stream.str() << std::endl; 
    return 0; 
} 
+0

也許我讀錯了,但似乎鏈接的文章說2010年可能不需要/ vd2標誌? – crashmstr

+0

相信我我試過了,沒有它就不能使用虛擬繼承部分。但有了它,流析構函數失敗了。 –

回答

2

隨機的想法,可以解決這個問題爲您:

  1. 不要使用VS2010(棒2008發佈)
  2. 使用不同的STL(根據您的使用情況可能會非常痛苦,但從我收集的內容來看,問題來自2010年包含的STL)。

我沒有看到更多的選擇,短期改變代碼在構造函數/析構函數不能使用dynamic_cast的,並且完全移除/ VD2

+0

這是一個巨大的項目,所以重寫不是一個選項。嗯...... –

2

我已經更新我的博客文章的鏈接到的這個討論和你的代碼的一個改編版本來說明問題。我的初步結論「這似乎工作正常」仍然存在,因爲Gtk尚未與我相撞,但問題顯然仍然存在,並可能隨時顯現。

因爲您的代碼是重現問題的簡化示例,所以除了您可能不想做的事情之外,我無法爲您的特定情況提供解決方法(更改您的編譯器,請勿使用dynamic_cast等。 )

根據我的理解,/ vd2和標準庫的某些部分是不兼容的。你將無法按照你想要的方式進行工作。你需要溝通一個或另一個。

編輯:您編輯了您的問題,建議將sstreams包裝到不帶編譯/ vd2的不同翻譯單元中,並修改代碼以使用該包裝。這會給你兩個或多個編譯時使用不同標誌影響二進制接口的翻譯單元。您正試圖通過使用實現定義的脆弱方法來解決編譯器錯誤。雖然它可能有效,但我不會相信它。

+0

Thx,我現在正在考慮一個流包裝器,看到我更新的問題 –

+0

我們使用glibmm,這麼多的類繼承自Glib :: Object,並且實現以「class GLIBMM_API Object:virtual public ObjectBase」開始這些類需要/ vd2切換 –