2

nedmallocをアプリケーションに実装しているときに、nedmallocがメモリのブロックを解放することを拒否し、割り当てられなかったと主張する状況に頻繁に遭遇します。

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を見ます。私が今理解していないのは、この状態がどこから来ているのかということです。コード内のどこにもfm<=mを保証するものは見つかりません。それでも、「selectは壊れていません」:それが本当にnedmallocのバグであるとは思えません。おそらくどこかで何か間違ったことをしているのでしょうが、それを見つけることができません。nedmallocのデバッグ機能をオンにすると、問題は解決します。

ここの誰かがnedmallocの内部動作を理解している場合、なぜfm <= memが保証されているのか説明していただけますか?

4

2 に答える 2

1

私はそれが型SIZE_T_BITSIZEのビット数であると仮定しているsize_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。さらに、memand/orfmが unsigned 型である にキャストされたsize_t場合、演算は unsigned 型で行われます。つまり、差が 0 未満(size_t)mem(size_t)fmなる(size_t)mem - (size_t)fmことはありません。 . これは、正の値である差mem - fmプラスSIZE_MAXplusに等しくなります。その値を実装定義のオーバーフローする可能性があるか、オーバーフローしない可能性が1ある値に変換すると、正の値になります。int

したがって、あなたの質問に答えるために、(size_t)memが より小さい場合(size_t)fm、おそらくその時点より前にバグがあります。

とはm? mということですmemか?

編集nedmalloc:上記の理由により、のバグのように見えます。問題のコードは、最新バージョンでコメント アウトされています。

于 2010-03-25T16:26:36.080 に答える
1

この行にコメント /* See if mem is lower in memory than mem */ が追加され、ベータ svn1159 で #if 0 を使用して無効になっていることがわかります。状態は成熟しておらず、おそらく間違っています (コードの Linux 固有の部分にまだ残っています - おそらくそこも間違っているのでしょうか?)

教訓:「ベータ選択は壊れる可能性があります」。

于 2010-03-25T19:36:33.367 に答える