6

以下のプログラムに関して2つの質問があります。1。プログラムは要素(長方形と六角形のタイプ)のみを動的として作成しますか、それともそれらへのポインターも動的ですか?

2.プログラムの最後に削除がない理由。たとえば、次のようなものです:(要素のみが動的であると正しく仮定した場合..)

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

どうもありがとうございました、このウェブサイトは私の先生が助けることができないことで私を大いに助けてくれます!シラン

プログラムは次のとおりです。

 int main()
{
 // Create array of pointers to Shapes of various types.
 const int NUM_SHAPES = 3;

 Shape * shapeArray[] = { new Hexagon(),
 new Rectangle(),
 new Hexagon()
 };

 // Set positions of all the shapes.
 int posX = 5, posY = 15;
 for (int k = 0; k < NUM_SHAPES; k++)
     {
 shapeArray[k]->setPosition(posX, posY);
 posX += 10;
 posY += 10;
};

 // Draw all the shapes at their positions.
 for (int j = 0; j < NUM_SHAPES; j++)
{
 shapeArray[j]->draw();
 }

 return 0;
 }
4

3 に答える 3

7
  1. プログラムは、スタック上の Shape へのポインターの配列を作成します。配列のサイズは、コンパイル時にイニシャライザ リスト {} の長さからわかります。初期化子リストの各要素は、演算子 new によってヒープ上に作成された Shape のアドレスです。

  2. それらが解放されないという事実は悪いスタイルです.OSはプログラムの終了時に割り当てられた動的メモリを解放するため、この特定のケースでは影響はありませんが、メモリを削除せずにそのままにしておくと、「真の」メモリリークが検出されますより困難。

于 2012-12-15T10:36:47.240 に答える
2

1) はい。ポインターにのみメモリを割り当てます。次の 3 つのポインターの配列を作成します。

Shape * shapeArray[] = { new Hexagon(),
 new Rectangle(),
 new Hexagon()
 };

2) プログラムの終了時に、ポインタに割り当てられたメモリは通常、オペレーティング システムによって再調整されます。ただし、deleteOS の動作に依存しないように明示的に指定する必要があります。プログラムのサイズが大きくなるにつれて、トラックが失われ、メモリ リークが発生する可能性があります。

于 2012-12-15T10:36:34.123 に答える
-1

プログラムが占有していたすべてのメモリは、OS の終了後に解放されるため、ここで削除する必要はありません。

于 2012-12-15T10:32:38.090 に答える