2014-02-07 50 views
2

我必須維護一個大的遺留項目,我最近從Visual Studio 2008升級到Visual Studio 2012.因爲它是一個COM服務器和一個OCX控件,創建所有typelib的東西等導致了一些問題,我設法解決。但是,當我運行Release版本時,我經常碰到崩潰。升級到VS2012導致由於不同的VC++運行時崩潰?

我跟一些建議,我發現這裏的SO,並能在碰撞追查到下面的一段代碼:

int Phx2Preview::ClearOvlElementList() { 
    for (int i = 0; i < (int)m_vOvlElements.size(); i++) { 
     P_SAFE_DELETE(m_vOvlElements[i].pPolyOrig); // <- code crashes here 
     P_SAFE_DELETE(m_vOvlElements[i].pPolyDispl); 
    } 
    m_vOvlElements.clear(); 
    m_vRefElemList.clear(); 
    m_pRefElemSelected = NULL; 
    return PHXE_NO_ERROR; 
} 

P_SAFE_DELETE是檢查,如果指針爲空宏,並且如果它不是delete s並將其設置爲空。實際向量元素創建這樣的:現在

if (v1) { 
    tNew.pPolyOrig = new CInPolygon(); 
    tNew.pPolyDispl = new CInPolygon(); 
    tNew.pPolyOrig->FromSafeArray(v1); 
    tNew.pPolyOrig->Rotate(NULLPOINT, m_nTurnAngle*__pi/180.); 
    tNew.eType = (overlayET)type; 
    tNew.nImagenr = nImageNr; 
    m_vOvlElements.push_back(tNew); 
} 

,事情是,CInPolygon是從被使用Visual C++ 7.1創建的外部庫的類。 P_SAFE_DELETE也在該庫的頭文件中定義。從here我知道混合不同的運行時版本是不好this question讓我懷疑這種混合可能是由於崩潰造成的。

我的問題是:爲什麼會發生?畢竟,因爲newdelete都是從相同位置調用的,所以在不同的CRT之間不會傳遞實際的對象。另外,使用Visual Studio 2008編譯OCX時,不會出現任何問題。這是由於純粹的運氣?我猜這個基本問題也是存在的。而且,嗯,我能做些什麼來解決問題?切換回VS2008?


編輯

至於問:中CInPolygon析構函數只是

CInPolygon::~CInPolygon(void) { 
    m_vPoints.clear(); 
} 

這裏m_vPoints是在類中定義的std::vector<..>。也許我應該指出,從CInPolygon繼承:

interface IRoi { 
    virtual ~IRoi() { 
    return; 
    } 
public: 
    // other stuff 
}; 

(甚至不知道這是interface純C++有效的關鍵字...)難道是基類的析構函數中定義的事實標題導致問題?畢竟,主機程序也知道該頭文件。

+0

立即問題: - 你完全確定'我'的價值嗎? - 你能展示'CInPolygon'的析構函數嗎? – BeerBaron

+0

對帖子的編輯講述了析構函數。你對「我」有什麼意思?它受到我認爲的矢量大小的限制。 – Matz

+1

你有源訪問CInPolygon庫嗎?如果是這樣,請嘗試添加一個'new_CInPolygon'和一個'delete_CInPolygon'靜態函數,它們調用new和delete,但是來自「正確」運行時。 – Calvin1602

回答

2
tNew.pPolyOrig = new CInPolygon(); 

是的,這是保證失敗。由於程序中有不同的分配器,因此主機程序無法正確計算CInPolygon對象的大小。它使用完全不同的std :: vector實現。它在VS2012中被重寫,以利用C++ 11。不可避免的是,使用舊版本矢量的庫中的代碼將破壞堆。

必須重建庫以及使用完全相同的編譯器版本完全相同的設置。

+0

因此,如果宿主程序使用VS2008工具集進行編譯,那麼它的工作原理只是因爲VS2003和VS2008中的std :: vector'實現沒有太大差別? – Matz

+1

我沒有那個時間機器了。當你使用未定義的行爲時,「工作」是一個相對的術語,它可能與你之前從未注意到堆腐敗的溫和版本相同。 –

相關問題