6

20.6.9:

void deallocate(pointer p, size_type n);
  • 必須: p は、allocate() から取得したポインター値でなければなりません。n は、p を返した allocate の呼び出しに最初の引数として渡された値と等しくなければなりません。
  • 効果: p によって参照されるストレージの割り当てを解除します。
  • 備考: ::operator delete(void*) (18.6.1) を使用しますが、この関数がいつ呼び出されるかは不明です。

n返された allocate の呼び出しに最初の引数として渡された値と等しくない場合はどうなりpますか? 割り当てを解除しませんか? 投げるstd::bad_alloc?...

編集: 「何が起こるべきか」で私が実際に意味したのは、カスタム実装でスローまたはアサートしても問題ないでしょうか?

4

3 に答える 3

10

C ++標準では通常どおり、明示的に何も記述されていない場合、要件に違反すると未定義の動作が発生します。常に必要であることを意味します。これは要件であり、C++標準のオプションではありません。

たとえば、MSDNの内容は次のとおりです。

ポインタ_Ptrは、同じサイズとタイプの配列オブジェクトを割り当てる、* thisと比較するアロケータオブジェクトを割り当てるための呼び出しによって、以前に返された必要があります。

つまり、サイズは正確に一致する必要があります。一致しないと、未定義の動作が発生します。

于 2011-07-21T06:46:50.843 に答える
3

それは言いません。これは、それが厄介な「未定義の動作」になることを意味します。

于 2011-07-21T06:48:02.457 に答える
1

これは、ポインターからの割り当てのサイズがわからない、基になるアロケーターを許可するために標準に存在します。

たとえば、AmigaOS アロケータは空きメモリ ブロックのリストを維持し、部分的な割り当て解除も許可します (つまり、1024 バイトを割り当ててからオフセット 256 で 512 バイトを解放すると、最終的に 256 バイトの割り当てが 2 回発生します)。この情報をデアロケータに渡します。

于 2011-07-21T12:46:31.900 に答える