首页 > 解决方案 > 清除在 main() 中分配的堆栈内存?

问题描述

从我记事起,我就一直在调用堆指针,这反过来又让我在写作时思考它们的含义,我意识到我不知道如何甚至是否可以清除堆栈分配内存后在 main() 中声明的变量。

显然,我可以只使用结构和析构函数或类似的,但可以说我想删除在 main() 中声明的堆栈上的数组是否可能?

标签: c++

解决方案


我想删除在 main() 中声明的堆栈上的数组是否可能?

是的。

在 main() (以及大多数使用自动变量的地方)中,您可以通过关闭包含范围来触发 dtor。

例子:

int main(int argc, char* argv[])
{
   int retVal = 0;
   int arr[10];
   T610_t  t610;
   retVal = t610.exec(argc, argv);
   // ...
   // ...  // t610 exists to end of main() scope.
   // ...  // arr[10] exists to end of main() scope
   return retVal;
}

实例 t610(用户定义的 T610_t 类型)持续程序的生命周期,即使在 exec() 返回 retVal 后未使用时也是如此;


相比之下:

int main(int argc, char* argv[])
{
   int retVal = 0;
   {
      int arr[10];
      T610_t  t610;
      retVal = t610.exec(argc, argv);
   }
   // ...   // no t610 instance exists, and arr[] is no longer accessible
   // ...
   // ...
   // ...
   return retVal;
}

在 exec() 返回 retVal 之后,实例 t610 的 dtor 在右大括号处被调用。arr[10] 也不再存在。

大括号之后的所有行都无法访问 T610_t 和 arr[10],并且在“小范围”中抓取的任何自动内存都被“释放”以供重用。(例如,另一个 T610_t 实例...)

T610_t 使用的空间的任何“清除”都取决于 dtor 的作用以及清除的含义。因此,例如,可以用 0 填充 T610_t 的数组数据属性(以“清除”它),并且 dtor 还释放内存以供重用。请记住,当您没有“新建”时不要删除。


推荐阅读