动态内存分配 - 为什么程序结束时没有"删除"?

Oha*_*had 6 c++

我有两个关于下面程序的问题:1.程序是否只创建动态元素(类型矩形和六边形),还是指向它们的指针是动态的?

2.为什么程序最后没有删除.例如这样的事情:(如果我正确地假设只有元素是动态的..)

for(i=0;i<3;i++)
    delete shapeArray[i];
Run Code Online (Sandbox Code Playgroud)

非常感谢,这个网站帮助了我很多老师无法帮助的事情!使然

该计划是:

 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;
 }
Run Code Online (Sandbox Code Playgroud)

Éti*_*nne 7

  1. 您的程序在堆栈上创建一个指向Shape的指针数组.数组大小在编译时从初始化列表{}的长度已知.初始化列表中的每个元素都是通过operator new在堆上创建的Shape的地址.

  2. 它们没有被释放的事实是糟糕的风格,你的操作系统将释放程序退出时分配的动态内存,因此在这种特殊情况下它不会产生一些后果,但是保留内存不会被删除会导致检测到"真正的"内存泄漏更加困难.


Den*_*lin -1

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

  • 依靠。在大多数现代操作系统上,是的。当然,这并不是偷懒的“好”理由。 (2认同)
  • 甚至在某些情况下,我会主张让操作系统进行清理工作。在使用大量内存(其中大部分内存被调出)的足够大的应用程序中,关闭应用程序可能是一项非常昂贵的操作,因为所有内存都需要调回以递归地释放所有内容。操作系统会丢弃所有内容,而无需将其分页。因此,作为一种罕见的优化,对于某些应用程序来说,泄漏可能会很好(并且要非常小心地确保其析构函数执行任何实质性操作的对象不会包含在泄漏中)。 (2认同)