2011-10-18 9 views
3

以前に割り当てられたメモリブロックからオブジェクトの配列を構築する必要があります。しかし、ブロックのサイズが必要なので、ブロックを割り当てるときには、ユーザの観点からは、どのように::operator new[]()::operator new()と異なるのか理解できません。次の例では、いずれかを使用すると同じ効果があるようです。何か不足していますか?どのように:: operator new()()と:: operator new()の違いは何ですか?

class J { 
}; 

int main() { 
    const int size = 5; 

    { 
     J* a = static_cast<J*> (::operator new[](sizeof (J) * size)); 
     for (int i = 0; i < size; i++) 
      new (&a[i]) J(); 
     for (int i = 0; i < size; i++) 
      a[i].~J(); 
     ::operator delete[] (a); 
    } 

    { 
     J* a = static_cast<J*> (::operator new(sizeof (J) * size)); 
     for (int i = 0; i < size; i++) 
      new (&a[i]) J(); 
     for (int i = 0; i < size; i++) 
      a[i].~J(); 
     ::operator delete (a); 
    } 
} 
+0

[別の "演算子new \ [\]"を持つ目的は何ですか?(http://stackoverflow.com/questions/2499895/whats-the-purpose-of-having-a-separate -operator-new) –

+0

私は同じとは思わない。そこにOPは違いが何であるかを知っていて、理由を尋ねていました。ここでOPは違いが何であるかを尋ねる。 C++に慣れ親しんでいる人にとっては、混乱しやすいですが、確かに同じ質問ではありません。 – littleadv

+0

@littleadv:私はそれを見ています(あなたのコメントを考慮した後も)、まったく同じ質問です。 –

答えて

3

あなたはnewを悪用しています。

new []の使用のポイントは、割り当てられている配列の各要素ごとにコンストラクタを呼び出すことです。 delete[]はデストラクタでも同じことをします。

プレースメントnewを使用していて、コンストラクタとデストラクタを手動で呼び出して、ポイント全体が欠落しています。

+0

私はあなたを理解していないので、もっと説明できますか?私は意図的に新しいものを使用せずに[]を削除したい。 case :: operator newはオブジェクトの配列の構築とは別に呼び出さなければならないが、私は2つのアプローチの間に違いは見られない。 – Martin

+0

それはOPがそれを知っていたように私に見えた。しかし、その質問は以前の質問の正確な複製と思われる。だから私は閉会することにしました。 –

+0

@Martin、 'malloc'の代わりに' new'を使っているのならば違いはありません。それは 'new'を一般的にどのように使うべきか(C++で許されていますが)です。 – littleadv

3

これらはどちらも割り当て関数なので、要求されたサイズ(ここではsizeof(J) * size)の適切なストレージを返すように指示されています。だから彼らはあなたのコードに違いはありません。それらが異なる

operator new[]がアレイ新しい表現(で検索された割り当て関数であるのに対しoperator newは、非アレイ新しい表現(例えばnew J)で検索された割り当て関数であることです例えばnew J[1])。これにより、プログラムが単一のオブジェクトのメモリを割り当てるための戦略と異なる配列にメモリを割り当てる特定の戦略を持っている場合、カスタマイズが可能になります。そのようなカスタマイズが必要ない場合、operator new[]operator newに委任することができます(実際には、実装によって提供される割り当て関数(つまり、::operator new::operator new[])に必須です)。その違いはあなたのコードとは関係ありません。

+0

'new J [1];は、通常、sizeof(J)* 1バイト以上を割り当て関数から要求することに言及する価値があります。 –

+0

@KerrekSB私は新しい表現(通常のプレースメントnew以外)は本当にここに焦点を当てているとは思わない。 –

関連する問題