4

delete []p を使用すると、ヒープの破損が発生します。

Rectangle *p[3];

for (int i = 0; i<3; i++)
  p[i] = new Rectangle();

p[0]->set(3, 4); 
p[1]->set(10, 8); 
p[2]->set(5, 6); 

for(int i=0; i < 3; i++) 
    cout << "Area is " << p[i]->area() << endl; 

delete []p; 

delete [] をに変更した後

for (int i = 0; i<3; i++)
    delete p[i]; 

動作しますが、delete []p を使用できないのはなぜですか? delete []p は p[0] のみを削除し、delete []p で [] は何を意味しますか?

4

3 に答える 3

9

delete []は、 での割り当て後にのみ使用され、 の後にのみ使用さnew []deleteますnew

これが C++ の仕組みです。単純に 3 の配列を割り当てたい場合はRectangle、次を使用します。

Rectangle *p = new Rectangle[3];

...

delete [] p;
于 2013-06-20T14:40:58.373 に答える
-1

p はポインターの配列であり、[] p のみを削除すると、ポインターが指しているオブジェクトではなく、ポインターの配列のみが削除されます。そのため、すべての配列を反復処理して、各ポインターで作成されたオブジェクトを削除する必要があります。二次元動的配列を使用する場合も同じことが起こります。

于 2013-06-20T14:48:54.427 に答える