我必須維護一個大的遺留項目,我最近從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讓我懷疑這種混合可能是由於崩潰造成的。
我的問題是:爲什麼會發生?畢竟,因爲new
和delete
都是從相同位置調用的,所以在不同的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++有效的關鍵字...)難道是基類的析構函數中定義的事實標題導致問題?畢竟,主機程序也知道該頭文件。
立即問題: - 你完全確定'我'的價值嗎? - 你能展示'CInPolygon'的析構函數嗎? – BeerBaron
對帖子的編輯講述了析構函數。你對「我」有什麼意思?它受到我認爲的矢量大小的限制。 – Matz
你有源訪問CInPolygon庫嗎?如果是這樣,請嘗試添加一個'new_CInPolygon'和一個'delete_CInPolygon'靜態函數,它們調用new和delete,但是來自「正確」運行時。 – Calvin1602