2011-08-19 72 views
3

我正在使用從Visual C++ 6.0移植到VC++ 9.0(2008)的遺留代碼。我使用_CRT_SECURE_NO_WARNINGS預處理器定義禁用了安全的CRT警告。但是這會導致破壞者在std::vector崩潰。定義_CRT_SECURE_NO_WARNINGS導致向量析構函數崩潰

使用中的任何問題_CRT_SECURE_NO_WARNINGS

+0

堆損壞不需要預處理器定義來以字節爲單位。 –

回答

1

它是如何崩潰?這聽起來更像是你在一個位置有內存覆蓋你的向量中的內存,然後釋放它,然後釋放你的向量。我會看指向任何地方。既然你現在在一個符合標準的編譯器上,用boost共享指針或boost數組替換它們。任何消除指針算術需求的地方,迭代器會更安全。

+0

因爲代碼是由第三方編寫和授權的,所以我無法使用增強/更改代碼。 – sarat

+1

VC++ 6.0的問題在於它是一個不符合標準的編譯器。當你從一個移植到另一個時,你會遇到問題。此外,如果您試圖從VS2008調用VC++ 6.0編譯的dll或lib,您可能會打開潘多拉的盒子來解決問題。只要充實並移除儘可能多的指針區域即可。這可能是舊代碼錯了,直到現在才發生。這就是內存問題有時會如何工作...... – wheaties

+0

@sarat:那麼問題是怎麼回事? –

1

這些都是不相關的問題。 _CRT_SECURE_NO_WARNINGS僅抑制棄用警告,它不會更改程序行爲。你必須調試實際的問題。

1

你絕對是其中之一,需要快速和骯髒的解決方案,以「讓它工作」任何方式。糟糕的做法。不要定義該指令來隱藏警告,而是在代碼中啓用所有警告(級別4 - /W4),並努力刪除所有警告。通過消除由它們引起的所有可能的警告和副作用,使您的代碼更健壯。在VC6和最新的VC編譯器之間有着巨大的區別 - 在VC6中完美的工作可能現在不起作用,它不是最新的編譯器的錯誤,而是代碼的錯誤。編譯器/調試器有助於及早發現缺陷(在開發/調試階段)。

我也建議你運行一些靜態分析(如使用/analyze開關的更高版本的Visual Studio中的代碼分析,如果有的話)。您還應該在代碼上運行動態代碼分析以查找更多問題。