抛出的对象在哪里分配?

时间:2013-09-03 12:59:38

标签: c++ exception-handling try-catch

当我在函数中使用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块中调用某些函数,我可以遍历数组吗?

3 个答案:

答案 0 :(得分:2)

它依赖于实现。 g++ 4.4尝试malloc内存,如果失败,则尝试在系统范围的紧急缓冲区中构造异常,失败所有调用std::terminate

答案 1 :(得分:1)

这是一种依赖于实现的行为,并且与使用的ABI严格相关。

如果您使用linux / unix,我建议您从GNU查看libsupc++

简而言之,它就像任何其他库一样,您没有为每个编译器/ C ++标准库提供标准实现,但您必须查看编写库的人是如何实现给定指令的。

答案 2 :(得分:1)

由实施决定。不同的实现方式 不同的政策,但在大多数情况下,它们涉及一些 特殊的预分配空间,静态或线程本地。 (如果 你必须分配投掷std::bad_alloc,你在 麻烦。)

至于你的第二种情况,它并不是真的相似,因为数组 指针转换发生在throw之前。所以你真的 只扔指针;指针的空间处理为 通常,但是一旦你离开阵列所在的区块 宣布,它已经消失了。即使在catch区块(在您的区域内) 例如,访问它是未定义的行为。