2010-03-25 39 views
2

當我的應用程序中實現nedmalloc時,我經常遇到一種情況,當nedmalloc拒絕釋放一塊內存時,聲稱它沒有分配它。nedmalloc:mem> = fm從哪裏來?

我正在使用v1.06beta1_svn1151版本。

在調試過程中,我發現一個特定的條件失敗,所有其他(包括幻數)成功。條件是這樣的:

if((size_t)mem-(size_t)fm>=(size_t)1<<(SIZE_T_BITSIZE-1)) return 0; 

在Win32這似乎是等同於:

if((int)((size_t)mem-(size_t)fm)<0) return 0; 

這似乎是一樣的:

if((size_t)mem<(size_t)fm) return 0; 

在我來說,我真的看到MEM < fm。我現在不明白的是,這種情況從何而來。我找不到任何能夠保證代碼中任何地方的任何東西。然而,「選擇沒有破裂」:我懷疑它確實是nedmalloc中的一個錯誤,很可能我在某處做錯了什麼,但是我找不到它。一旦我打開了nedmalloc的調試功能,問題就消失了。

如果有人在這裏瞭解nedmalloc的內部工作,請你向我解釋爲什麼fm < = mem保證?

+1

當前nedmalloc源代碼,我無法找到。你正在使用哪個版本? – Thomas 2010-03-25 16:22:43

+0

瘋狂。我沒有想到,爲這種詳細的技術問題問題upvote,特別是。這不是很快。有人在那裏喜歡並理解這些東西,或者猴子程序員已經在這裏,隨機提問? (但是他們怎麼能夠得到足夠的聲望去投票?)無論如何,我希望有人會回答 - 在這種情況下,這對我來說比聲譽更重要。 – Suma 2010-03-25 16:23:40

+0

你提出了一個很好的描述問題,希望這將產生約內存管理一個有趣的問題了一些解釋,所以難怪有人upvoted你。 – Francesco 2010-03-25 16:55:48

回答

1

我現在可以看到這行添加了一條評論/ *查看mem是否比mem * /更低,並且它在beta svn1159中使用#if 0被禁用。這個條件還不成熟,它可能是錯誤的(它仍然留在Linux特定部分的代碼中 - 很可能在那裏錯了?)

教訓: 「公測選擇可以被打破」。

+0

哈哈,是啊,你更新你的帖子後,包括您使用的是SVN版本,我注意到你提到的線是不是在目前的穩定版本,我開始懷疑選擇,以及... :) – Thomas 2010-03-25 20:13:29

+0

現在該怎麼做?整個問題似乎現在都沒有實際意義 - 我認爲StackOverflow在各種庫中都應該記錄已經修復的錯誤。我想我可能會投票刪除這個問題? (儘管如此,我很高興能夠提出這個問題 - 關於哪個版本對我有很大幫助的問題)。 – Suma 2010-03-25 20:17:15

1

我假設SIZE_T_BITSIZEsize_t類型的位數,所以移動1 SIZE_T_BITSIZE - 1會給你(SIZE_MAX + 1)/2(數學)值。因此,條件是測試(size_t)mem - (size_t)fm是否大於或等於(SIZE_MAX + 1)/2的數學值。

這與(int)((size_t)mem - (size_t)fm) < 0不一樣。此外,如果將mem和/或fm轉換爲size_t(其是無符號類型),則算法發生在無符號類型中,這意味着該差值不能小於0.因此,即使(size_t)mem小於(size_t)fm,(size_t)mem - (size_t)fm也不會將小於0.它等於差值mem - fmSIZE_MAX1,這是一個正值。將該值轉換爲int可能會溢出,這是實現定義的,或者可能不會溢出,在這種情況下,您最終會得到正值。

因此,要回答你的問題,如果(size_t)mem小於(size_t)fm,你點之前可能有一個錯誤

什麼是m?由m,你的意思是mem

編輯:看起來像nedmalloc中的一個錯誤,原因如上所述。有問題的代碼是commented out in the latest version

+0

我假設Win32(如標籤所示)。 – Suma 2010-03-25 16:44:19

+0

是的,m應該是mem。感謝您指出,現在已經得到糾正。 – Suma 2010-03-25 19:37:49

+0

@Suma,看我的編輯。 – 2010-03-25 20:04:50