4

例如,当我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块内调用一些函数,我可以在数组上运行吗?

4

3 回答 3

2

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

于 2013-09-03T13:10:12.093 回答
1

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

libsupc++如果您在 linux/unix 下,我建议从 GNU看一下。

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

于 2013-09-03T13:16:27.827 回答
1

这取决于实施。不同的实现有不同的策略,但在大多数情况下,它们涉及一些特殊的预分配空间,要么是静态的,要么是线程本地的。(如果你必须分配给 throw std::bad_alloc,你就有麻烦了。)

至于你的第二种情况,它并不是很相似,因为数组到指针的转换发生在抛出之前。所以你真的只是在抛出一个指针;指针的空间像往常一样被处理,但是一旦你离开了声明数组的块,它就消失了。即使在catch块中(在您的示例中),访问它也是未定义的行为。

于 2013-09-03T13:24:27.067 回答