在下面的代码中,基于堆栈的变量"ex"被抛出并被捕获到超出声明ex的范围的函数中.这对我来说有点奇怪,因为(AFAIK)基于堆栈的变量不能在它们被声明的范围之外使用(堆栈被展开).
void f() {
SomeKindOfException ex(...);
throw ex;
}
void g() {
try {
f();
} catch (SomeKindOfException& ex) {
//Handling code...
}
}
Run Code Online (Sandbox Code Playgroud)
我已经向SomeKindOfException的析构函数添加了一个print语句,它显示ex在f()中超出范围后被破坏但是它在g()中被捕获并且一旦它超出范围就再次被破坏.
有帮助吗?
可能重复:
为什么两个不同的概念都称为"堆"?
我用Google搜索过,但找不到这个问题的答案; 动态内存分配中使用的堆与数据结构之间的连接是什么?内存是否以与堆数据结构类似的方式组织在堆上?如果是这样,这看起来很奇怪,因为获取内存应该是随机访问AFAIK(即O(1)),但是从堆中查找项目不会在恒定时间内完成.
那么,这只是堆的重载意义,可以这么说,还是有某种连接?