これは一般的に非常に悪い考えであり、安全に実行できるのはプログラムを終了することだけであることを示唆するSOについても含めて、私は多くのことを読みました。これが本当かどうかはわかりません。
これは、mallocに大量の割り当てを渡すプーリングメモリアロケータ用です。pool_free()中に、ポインターがプールに属しているか、mallocで割り当てられているかを確認する必要があります。アドレスを最も近い1MBの境界に切り捨てることにより、プール内のメモリブロックの先頭へのポインタを取得します。mallocが使用されている場合は未定義です。最初のケースでは、メモリのブロックがプールに属していることを簡単に確認できますが、そうでない場合は、この確認に失敗するか、アクセス違反が発生します(これは読み取り専用プロセスであることに注意してください)。これをSEH(Windows)でキャッチしたり、シグナル(POSIX)を処理して、検証の失敗として処理したりすることはできませんか?(つまり、これはmallocが使用された場合にのみ可能であるため、ptrをfree()に渡します)
編集:人々は上記のORを見逃しているようです。ポインターがmallocで割り当てられた場合、アクセス違反が発生することはないと思いますが、これは考えられる結果の1つです。ブロックの先頭(1MB境界)へのポインタを使用する手順は、マジックナンバーを確認してから、メモリプールへのポインタをたどり、ブロックへの前述のポインタが実際に含まれていることを確認することです。これらの読み取り専用ステップのいずれかがアクセス違反を生成した場合、個々のステップが失敗した場合と同じように確実に検証に失敗します。