2010-02-21 23 views
6

我寫了自己的引用計數內存管理器c + +(爲了好玩),我確定它不是完美的;)。現在,當我嘗試使用它時,我得到了隨機的SIGTRAP信號。如果我註釋掉與該內存管理器有關的每一行,一切運行良好。獲取SIGTRAP-s而不是SIGSEGV很奇怪。 我知道SIGTRAP-s在程序遇到斷點時拋出,但沒有設置斷點。我在另一個線程中讀到,exe和dll的調試版本必須是最新的。它們是最新的,所以它不是原因。獲取隨機SIGTRAP信號(在MinGW-gdb中)是內存損壞的標誌嗎?

有誰知道爲什麼會發生這種情況?

+0

由於您在Windows上,您幾乎可以肯定*不*獲取任何SIGTRAP(這是一個UNIX概念,根本不適用於Windows)。 爲什麼不編輯你的問題來描述你實際觀察到的? – 2010-02-24 08:08:34

+7

MinGW在windows下也說SIGTRAP。 – Calmarius 2010-02-24 13:40:12

回答

4

在谷歌上搜索後,我意識到這些sigtraps與你在MSVC++中得到的警告是一樣的:「Windows已經在xxxx.exe中觸發了一個斷點,這可能是由於堆損壞了,並且指出了一個bug blahblahblah 」 ......

如此看來,是的,意想不到的sigtraps可以指示內存corrupction(很奇怪...)

而且我發現我的錯誤了。 MM是在一個靜態庫中,鏈接到一個DLL。並且該靜態庫和dll鏈接到我的exe文件。所以有兩個內存管理器,一個在我的exe中,另一個在我的dll中。如果調用MM的初始化方法。它在我的exe中初始化了MM,但不是在dll中,所以dll沒有init。我解決了這個問題,沒有將我的exe與靜態庫鏈接起來。

2

我猜測你可能調用了不匹配的new/delete或malloc/free實現 - 因此,內存管理器分配了一些內存,但是當內存被釋放時,最終會使用默認的刪除/釋放實現。

在信號上設置斷點並查看堆棧上是否存在空閒()或運算符刪除以及是否實現了您期望的所述函數。