当我在函数中使用throw
时,例如
try {
// ...
throw MyExceptionType()
// ...
} catch(MyExceptionType& exp){ /* ... */ }
MyExceptionType
在哪里分配?它在堆栈上吗?如果是这样,在exp
块中修改catch
是否安全?如何调用catch
中的其他函数并使用堆栈?
在类似情况下,我有:
try {
char my_array[32];
throw my_array;
} catch(char* error_string){ /* ... */ }
error_string
是否指向进程堆栈中的某个位置?如果我在catch
块中调用某些函数,我可以遍历数组吗?
答案 0 :(得分:2)
它依赖于实现。 g++ 4.4
尝试malloc
内存,如果失败,则尝试在系统范围的紧急缓冲区中构造异常,失败所有调用std::terminate
。
答案 1 :(得分:1)
这是一种依赖于实现的行为,并且与使用的ABI严格相关。
如果您使用linux / unix,我建议您从GNU查看libsupc++
。
简而言之,它就像任何其他库一样,您没有为每个编译器/ C ++标准库提供标准实现,但您必须查看编写库的人是如何实现给定指令的。
答案 2 :(得分:1)
由实施决定。不同的实现方式
不同的政策,但在大多数情况下,它们涉及一些
特殊的预分配空间,静态或线程本地。 (如果
你必须分配投掷std::bad_alloc
,你在
麻烦。)
至于你的第二种情况,它并不是真的相似,因为数组
指针转换发生在throw之前。所以你真的
只扔指针;指针的空间处理为
通常,但是一旦你离开阵列所在的区块
宣布,它已经消失了。即使在catch
区块(在您的区域内)
例如,访问它是未定义的行为。