【问题标题】:Where are program allocate memory for throwing object?程序在哪里为抛出对象分配内存?
【发布时间】:2020-06-18 14:45:06
【问题描述】:

如果我从函数 h() 中抛出一些字符串

f()->g()->h()

这样

throw std::string("error");

并且只在 f() 中捕获。程序在哪里为这个字符串分配内存?显然它不能在 h() 的堆栈上分配它。如果这是 f() 堆栈,它以什么方式知道它应该分配到什么位置?

【问题讨论】:

  • "...异常对象是 unspecified storage 中的临时对象,由 throw 表达式构造...":来源: en.cppreference.com/w/cpp/language/throw
  • std::bad_alloc 总是让事情变得复杂。
  • 当程序未能为异常对象分配存储空间时,乐趣就开始了。我认为有些实现只是在启动时为此目的预留了一块内存?

标签: c++ memory stack throw


【解决方案1】:

如果这是f() 的堆栈,它以什么方式知道应该分配到什么位置?

这是一个以未指定方式分配的临时对象。

来自标准的Throwing an exception 部分:

3 throw-expression 初始化一个临时对象,称为异常对象,其类型是通过从 throw 和分别将类型从“T”或“函数返回T”调整为“指向T”或“指向函数返回T”的指针。 ...

4 异常对象的内存以未指定的方式分配,除非在 [basic.stc.dynamic.allocation] 中注明。 ...

【讨论】:

    猜你喜欢
    • 2013-09-06
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2021-11-28
    相关资源
    最近更新 更多