2

デフォルト コンストラクターのないクラスの場合、演算子 new と配置 new を使用して、そのようなクラスの配列を宣言できます。

More Effects C++ でコードを読んでみると、以下のようなコードを見つけました(一部改変しています).....

私の質問は、なぜ演算子 new の後に [] が必要なのですか?

私はそれなしでテストしましたが、それでも動作します。誰かがそれを説明できますか?

class A {
    public:
    int i;

    A(int i):i(i) {}
};

int main()
{
      void *rawMemory = operator new[] (10 * sizeof(A));   // Why [] needed here?
      A *p = static_cast<A*>(rawMemory);

      for(int i = 0 ; i < 10 ; i++ ) {

            new(&p[i])A(i); 

      }

      for(int i = 0 ; i < 10 ; i++ ) {

            cout<<p[i].i<<endl;

      }

      for(int i = 0 ; i < 10 ; i++ ) {

            p[i].~A();

      }

    return 0;
}
4

4 に答える 4

2

.Effective C++ がvoid*.

new[]非常に具体的なことを行います。動的にサイズ変更された配列を割り当てます。それとともに割り当てられた配列は、 に渡される必要がありますdelete[]delete[]次に、隠し数値を読み取って配列内の要素数を見つけ、 で行ったようにオブジェクトを破棄しますp[i].~A();

ただし、この使用法はそれと互換性がありません。new[]配列は静的にサイズ設定されており、適切に(no )を使用しないと、その隠し数値または動的サイズの破棄を取得する方法がないためoperator、デフォルトのコンストラクターが必要になります。C++ の真の弱点。

他の人が示唆したようdelete[]に最後に呼び出した場合、コードがクラッシュする可能性があります。main代わりに を使用する必要がありますoperator delete[]。これはタイプミスのように見え、起こるのを待っている単なる事故です。

このトリックを使用する必要がある場合は、非配列operator newで十分なコメントを使用してください。operator deleteしかし、私はこれが特に効果的な C++ であるとは考えていません。

于 2010-03-26T07:31:15.780 に答える
2

必要ありません。operator new と operator new[] の唯一の違いは、前者はキーワード new を使用して呼び出され、もう一方はキーワード new[] を使用して呼び出されることです。どちらも生メモリを割り当てます。

最終的にメモリを解放するとき (ここでのコードは単にリークするだけです)、new または new[] に一致する delete または delete[] を呼び出すことを確認してください。

于 2010-03-26T02:41:08.847 に答える
1

この場合、厳密には必要ありません。どちらも同じ量のメモリを割り当てますがdelete、一方が必要delete[]になり、最後にもう一方が必要になります。を使用new[]すると、意図がいくらか明確になります。そのため、ここで使用されています。

于 2010-03-26T02:44:48.700 に答える
0

実際には必要ありません。選択した場合に、配列用のメモリを単一オブジェクト用のメモリとは別に割り当てる機会を与えるだけです。

于 2010-03-26T02:47:52.740 に答える