2

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[] は破棄される要素の数をどのように知るのでしょうか?

http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/new_opv.cc?revision=195701&view=markup

SOに関する多くの関連する質問を調べ、グーグルで検索しましたが、答えが見つかりませんでした.

4

2 に答える 2

0

コンパイラは、割り当てられたメモリでコンストラクタを呼び出すことによって何らかのトリックを実行しますか?

はい、operator new上に表示されているのは、メモリ ブロックを取得する部分の実装のみです。コードでを使用new Tする場合、コンパイラは適切なoperator new (size_t)実装を呼び出してメモリ ブロックを取得し、そのT上でコンストラクタを呼び出します。

于 2013-10-20T00:02:25.273 に答える