c++ - 清除在 main() 中分配的堆栈内存?
问题描述
从我记事起,我就一直在调用堆指针,这反过来又让我在写作时思考它们的含义,我意识到我不知道如何甚至是否可以清除堆栈分配内存后在 main() 中声明的变量。
显然,我可以只使用结构和析构函数或类似的,但可以说我想删除在 main() 中声明的堆栈上的数组是否可能?
解决方案
我想删除在 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 还释放内存以供重用。请记住,当您没有“新建”时不要删除。
推荐阅读
- proxy - 如何在没有 CA 或 MITM 的情况下通过 HTTP 代理 HTTPS?
- c++ - 为什么警告会阻止我们编写优化程序?
- javascript - 使用 collection_select() 过滤 fullCalendar() 上的事件
- android - Android Studio 中未显示按钮
- javascript - A-Frame 超手移动抓取物体
- apache - 重写子域会导致 HTTP 重定向而不是
- sql-server - 用户为访问 SQL 代码选择变量
- c# - 通过 Lucene.net 3.0.3 或最新版本获取附近的地方
- c++ - 如果输入缓冲区不为空,则使用 getchar() 检测 Ctrl+d
- python - Django - 使用选项但没有函数参数执行 Celery 任务