0

Doug Lea の dlmalloc メモリ アロケータを使用しています。ただし、それを使用するとセグメンテーションが発生します。通常の malloc を使用すると、プログラムは正常に動作します。dlmalloc を機能させるには、最初に何らかの初期化関数を呼び出す必要があることを読んだことがありますが、今ではどの関数か思い出せません。コメントを見てどの機能を見つけようとしましたが、まだ見つかりません。

4

1 に答える 1

3

アロケータのソース コードのコメントから:

トレッドセーフ: USE_LOCKS がゼロ以外で定義されていない限り、スレッドセーフではありません

USE_LOCKS が定義されている場合、malloc、free などの各 public 呼び出しはロックで囲まれます。デフォルトでは、プレーン pthread ミューテックス、win32 クリティカル セクション、またはプラットフォームで使用可能であり、USE_SPIN_LOCKS=0 を設定して無効にされていない場合はスピンロックを使用します。

ライブラリを でコンパイルする必要がありますUSE_LOCKS。そうしないと、クラッシュが発生する可能性があります。

もう 1 つの可能性は、プログラムが未定義の動作を示し、通常のmalloc. たとえば、どこかに割り当てられた領域を超えて 1 バイトを書き込む可能性がありますが、そのバイトは、要求したものよりも数バイト大きいメモリ チャンクの一部である可能性があります。valgrind を使用して、プログラムをカスタム アロケータにリンクする前に、「通常の」malloc でメモリ エラーがないかどうかをチェックします。

于 2012-07-03T10:28:34.197 に答える