C++ の学習を開始して以来、「new」演算子は、割り当てられたメモリへのポインターを返す前に、オブジェクトのコンストラクターを呼び出すことを常に読んできました。
それで、好奇心から「new」のソースコードをチェックしたところ、http: //gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/で次のことがわかりましたnew_op.cc?revision=197380&view=マークアップ
_GLIBCXX_WEAK_DEFINITION void *
operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc)
{
void *p;
/* malloc (0) is unpredictable; avoid it. */
if (sz == 0)
sz = 1;
p = (void *) malloc (sz);
while (p == 0)
{
new_handler handler = std::get_new_handler ();
if (! handler)
_GLIBCXX_THROW_OR_ABORT(bad_alloc());
handler ();
p = (void *) malloc (sz);
}
return p;
}
コンストラクターが呼び出されたり、オブジェクトのタイプを識別するためのメカニズムが表示されたりすることはありません。
それで、これはどのように行われますか?コンパイラは、割り当てられたメモリでコンストラクタを呼び出すことによって何らかのトリックを実行しますか? どんな助けでも大歓迎です。
また、new[] (以下のリンク) の場合、配列内の要素数を追跡するためのエントリは作成されません。では、delete[] は破棄される要素の数をどのように知るのでしょうか?
SOに関する多くの関連する質問を調べ、グーグルで検索しましたが、答えが見つかりませんでした.