Malloc
Hoardメモリアロケータ(英語版)は、スケーラブルなメモリ確保性能を目指したアロケータである。OpenBSDのアロケータと同様、Hoard はmmapのみを使用するが、64キロバイトのスーパーブロックと呼ばれる塊ごとにメモリを管理する。Hoardのヒープは論理的にグローバルな1つのヒープとプロセッサ毎のヒープに分けられている。さらにスレッド毎のキャッシュを持ち、制限された数のスーパーブロックを保持できる。確保はスレッド毎またはプロセッサ毎のヒープからのみ行い、解放されたスーパーブロックの多くはグローバルなヒープに戻して他のプロセッサが使えるようにする。このようにしてHoardではスレッド数に対してほぼ比例したスケーラビリティを維持しつつ、フラグメンテーションを最小に抑えている。
ポインタがfree関数に渡され、メモリが解放された後でその領域への参照を行っても、その内容は未定義であり利用できない。しかし、ポインタ自体が残っていると誤って使ってしまうことがある。次のコードはその例である。
このようなコードは予測不能の振る舞いをする。メモリが解放された後でシステムがその領域を他の用途に転用しているかもしれない。従って解放済みメモリ領域へのポインタ(ダングリングポインタ; dangling pointer)を使った書き込みはプログラム内の別のデータを不正に書き換えてしまう。どういうデータを書き換えたかによって、その後のプログラムの動作も異なる。単なるデータ破壊で済むかもしれないし、クラッシュするかもしれない。特に破壊的なバグとしては、同じポインタを2回free関数に渡してしまうことであり、これを「二重解放; double free」と呼ぶ。これを防ぐため、解放した後でポインタ変数にNULLを格納することがある。ポインタ変数が無効な領域を指しているかどうかを後で調べるとき、NULLが格納されているかどうかで簡単に判定できるようになる。また、free(NULL)は何もしないことが規格で保証されているので、NULLを代入しておけば(free関数を再度呼んだとしても)二重解放の危険はない。この技法は寿命の長いグローバル変数でポインタを定義する場合は必須だが、寿命の短いローカル変数でポインタを定義する場合でもフールプルーフのために用いることができる。