哪个内存区域是异常类实例创建的?

时间:2010-02-12 14:15:07

标签: c++ exception

我无法找到异常处理期间创建的异常类实例的信息?在哪个内存区域(堆栈,堆,静态存储等)?我认为它不在堆栈中,因为堆栈展开...

4 个答案:

答案 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)

异常总是按值抛出,所以即使在堆栈上分配也没问题

相关问题