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 的指针数组。数组大小在编译时从初始化列表 {} 的长度已知。初始化器列表中的每个元素都是通过 operator new 在堆上创建的 Shape 的地址。

  2. 它们没有被释放的事实是不好的风格,当程序退出时,您的操作系统将释放分配的动态内存,因此在这种特殊情况下不会产生一些后果,但是不删除内存可以检测“真正的”内存泄漏更加困难。

于 2012-12-15T10:36:47.240 回答
2

1) 是的。它只为指针分配内存。它创建一个包含 3 个指针的数组,其中包含以下内容:

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

2) 在程序退出时,分配给指针的内存通常会被操作系统重新校准。但是,您应该delete明确地使用它们,以免依赖于操作系统所做的事情,并且随着程序大小的增长,您可能会失去跟踪并遇到内存泄漏。

于 2012-12-15T10:36:34.123 回答
-1

您的程序占用的所有内存将在操作系统退出后释放,因此没有理由在此处删除它。

于 2012-12-15T10:32:38.090 回答