删除C++中的堆栈变量
Deletion of stack variable in C++
在C++中,如果我们在函数内部声明堆栈变量,它是在函数结束时自动删除,还是在程序执行结束时删除?
此外,对于C语言,这个问题的答案是否相同?
对于堆栈声明的变量,会调用析构函数,并在超出范围时回收内存。
请注意,这并不意味着在函数末尾,如果变量是在内部块中声明的,比如if语句或循环。
int main(int argc, char **argv)
{
int a = 3;
if (argc > 1)
{
int b = 5;
++b;
} // b is destructed here
// a is destructed here
// argv and argc are destructed here (or with a)
}
EDIT:关于如何退出作用域并不重要这一事实,我们提出了一个很好的观点。所以…
#include <vector>
# include <exception>
int main(int argc, char **argv)
{
std::vector<int> myVector(10);
try
{
if (argc)
{
int a = 10;
int b = 12;
for (int c = 0; c < b; c++) // lol
{
int c_squared = c*c;
int theEleventhElement = myVector.at(c);
// the above will throw std::out_of_range at some point!
}
}
}
catch (std::out_of_range &ex)
{
// do nothing
}
}
当以上抛出时,堆栈将作为异常处理的一部分展开。因此,变量将按以下顺序销毁:
c_squared
c
b
和a
(我按这个顺序想,但我不知道标准中是否强制要求这样做)
此时,终于有了一个catch处理程序,它的作用域中只有myVector
。该块忽略异常,然后main
结束——此时myVector
被销毁。
根据3.7.2具有自动存储持续时间的对象持续到创建它们的块退出,6.6.2中有更多详细信息
在退出一个作用域时(但已完成),所有构造的对象都会调用析构函数(12.4)在该范围中声明的自动存储持续时间(3.7.2)(命名对象或临时对象)与他们声明的顺序相反。传出循环、传出块或返回经过初始化的变量具有自动存储持续时间涉及变量的销毁在从转移点的范围内,但在转移到的点不在范围内。
当它超出范围时,它会被销毁。与C.相同
自动变量在其封闭范围结束时自动销毁。
为了避免new
运算符的歧义,在离开函数时说变量是"弹出的"可能更合适:请参阅基于堆栈的内存分配。C.也是如此
堆栈变量或多或少是通过减少堆栈指针从堆栈中删除的几个字节,它在函数结束时被删除,但是,在C++中,由于额外的销毁内容,它并不是简单地再次向上移动堆栈指针(对于用户定义的类型)。
在C中,这是一种简单的情况,向上移动堆栈指针以清除所保留的变量。
相关文章:
- 堆栈变量超出范围时是否解除分配?
- 堆栈变量和函数C++奇怪的行为
- 野牛堆栈变量中的值分配
- 局部堆栈变量成员的返回值优化
- 访问其他线程堆栈变量如何在C++中工作?
- 指向堆栈变量的指针是否易失
- 是否可以 std::move 局部堆栈变量?
- 返回堆栈变量时停止调用析构函数
- 优化易失性堆栈变量的存储/构造是否合法
- SEGFAULT正在写入堆栈变量
- 汇编:C++堆栈变量地址不同/错误?
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- 返回堆栈变量
- Visual Studio 在引用堆栈变量时不使用 EBP
- 堆栈变量或函数声明
- 访问堆栈变量的速度比取消引用指针慢
- 静态变量与堆栈变量:线程安全与堆栈大小
- 堆栈变量生存期好奇的例子
- 如何查找未初始化的堆栈变量
- 如何为堆栈变量分配内存