我无法找到异常处理期间创建的异常类实例的信息?在哪个内存区域(堆栈,堆,静态存储等)?我认为它不在堆栈中,因为堆栈展开...
答案 0 :(得分:5)
来自标准:
15.2.4:抛出异常的临时副本的内存是 以未指明的方式分配, 除非在3.7.3.1中有说明。
而3.7.3.1说:
3.7.3.1:所有既没有动态的对象 储存时间也不是当地的 静态存储时间。存储 因为这些物体应该持久 计划的持续时间(3.6.2, 3.6.3)。
答案 1 :(得分:3)
答案是“在编译器管理的神秘区域” - 严重的是,标准没有规定必须存储它们的位置。
答案 2 :(得分:1)
厨房是否从标准中引用,未指明。大多数实现都是从堆中分配它们,因为它们需要在堆栈展开过程中存活,这可能会删除堆栈帧(在函数外部抛出)或创建新的(调用析构函数等)。 GCC使用内置函数__cxa_allocate_exception
来分配内存。
答案 3 :(得分:0)
异常总是按值抛出,所以即使在堆栈上分配也没问题