2012-08-29 84 views
0

我正在使用的軟件是一個插件DLL,一切工作正常,正常執行期間預期,但當主機卸載該模塊,內存釋放緩慢(幾個對象數組是通過「delete []」取消分配。如果我拿走所有「delete []」指令,模塊卸載變得更快)。這只是在調試版本發生的時候,發佈版本很快就會被卸載。我也注意到,如果我在其中一個析構函數中放置斷點,調試也很慢(每條指令平均需要2secs)。任何想法爲什麼發生這種情況?C++「刪除」調試版本緩慢

+4

在Visual Studio調試版本中,分配例程中存在內存損壞檢測。這些將需要一些時間。還有內存泄漏檢測。 – drescherjm

+2

我發現每條指令2秒很難相信。 –

+0

@KeithRandall我打賭「每條指令」只包括他在代碼中找到的'delete []'的數目。我敢打賭,每一個都被執行了很多次。我還敢打賭那些叫'刪除'的次數更多,他也沒有包括。我猜測每個堆的重新分配少於2秒。 –

回答

1

不確定你的情況。我已經看到類似的MS IDE和調試生成和報告內存泄漏。如果由於某種原因許多對象泄漏了,那麼將它們報告到輸出窗口花費了相當多的時間。

+2

我發現當泄漏很多時,這需要幾分鐘。 。 – drescherjm

0

我打算啓用我的心理調試帽,並假設您使用的是VC++。這是一個重要的信息,因爲它不提供我不得不猜測。

接下來,你會說「每條指令平均需要2秒」。如果通過「指令」指的是彙編語言指令,那麼這是調試器運行緩慢的一個單獨問題。有各種原因,例如設置了太多斷點(https://randomascii.wordpress.com/2011/07/02/xperf-and-visual-studio-the-case-of-the-breakpoint-hangs/),在源集中顯示線程(https://randomascii.wordpress.com/2013/03/03/visual-studio-single-step-performance-fixes/)或其他可能的原因。但這是調試器的問題,而不是調試版本問題。

在調試器下運行時,Windows堆運行速度較慢 - 它會執行其他檢查。這可能是問題,但請注意,這與您是否正在運行調試版本無關。

CRT堆在調試構建中運行速度較慢,並獲取每個分配和空閒的鎖,從而對分配進行序列化。而且,如果設置了_CRTDBG_CHECK_ALWAYS_DF,那麼整個堆將在每個alloc和free上檢查一致性,這可以使它們的數量級變慢。

要知道哪個是真正的問題的唯一方法是配置文件。