【问题标题】:Where are thrown objects allocated? [duplicate]抛出的对象分配在哪里? [复制]
【发布时间】:2013-09-06 17:31:07
【问题描述】:

例如当我在函数中使用throw

try {
   // ...
   throw MyExceptionType()
   // ...
} catch(MyExceptionType& exp){ /* ... */ }

MyExceptionType 分配在哪里?它在堆栈上吗?如果是这样,在我的catch 块中修改exp 是否安全?在catch 中调用一些其他函数并使用堆栈呢?

在类似的情况下,我有:

try {
   char my_array[32];
   throw my_array; 
} catch(char* error_string){ /* ... */ }

error_string 是否指向进程堆栈中的某个位置?如果我在 catch 块内调用一些函数,我可以运行数组吗?

【问题讨论】:

  • 这能回答你的问题吗? stackoverflow.com/questions/2404288/…
  • HAL 的链接有很好的解释。我想知道 C++11 如何使“特殊位置”线程安全。
  • @brianbeuning: 通过告诉编译器制造商它应该是 :)

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果您在 linux/unix 下,我建议您查看来自 GNU 的 libsupc++

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-06-18
        • 1970-01-01
        • 2021-04-30
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-17
        相关资源
        最近更新 更多