は、私は今、tは*(Pool**)ans = NULL;
が何をするのか理解しようとする時間を超える過ごしたこのスニペットここポインタをポインタにキャストしています...ポインタですか?
void* operator new(size_t nbytes)
{
if (nbytes == 0)
nbytes = 1; // so all alloc's get a distinct address
void* ans = malloc(nbytes + 4); // overallocate by 4 bytes
*(Pool**)ans = NULL; // use NULL in the global new
return (char*)ans + 4; // don't let users see the Pool*
}
https://isocpp.org/wiki/faq/dtors
を見つけました。 ans
は無効なポインタなので、Pool
ポインタにキャストされ、プールは0に設定されていると仮定します。ポインタは左に3番目の*
のためポインタですがプール自体はありません。しかしプールにはoperator=
が定義されていません。
pointer**
は、明らかにポインタへのポインタです...しかし、この文脈では、これは意味がありません。ans
は単一のポインタです。 「隠し」、4バイトのヘッダがPool
(SO ans
へのポインタであると考えPool
へのポインタへのポインタであることをおそらくため
「奇妙」ではありません。これは、オブジェクトへのすべてのポインタが4バイト(通常は32ビットとも呼ばれる)であり、関連するアラインメントであることを前提とするコードです。 '4 'はおそらく' sizeof(Pool *)'として書き直される方が良いでしょう。または完全に削除してください。オフセットは汚れたトリック(擬似安全対策を追加しようとしているプログラマー)のほうが多く、実際の使用量はそれほど多くありません。 (それを削除する場合は、 'Pool'を直接操作する他の関数も変更してください。オフセットも使用されます)。 – Peter
@Peter Samは「ODD」ではなく「OLD」と入力しました。 –