哪里有C++异常参数存储在内存中?

Jer*_*ang 5 c++

我对C++异常有疑问:

#include <iostream>
#include <string>

using namespace std;

void some_function()
{
    string str("Hello,World!");
    throw(str);
}

int main()
{
    try
    {
        some_function();
    }
    catch (string& e)
    {
        cout << e << endl;
        e = "Hello, the world!";
        cout << e << endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的电脑上调试:

  1. some_functionstr地址:0x003CF820
  2. 诠释maine地址:0x003CF738

我有三个问题,

  1. catch参数是string&,为什么我们在main()中得到diff addr?
  2. str不是一个临时的价值?为什么我们可以使用临时值参考?
  3. 哪里是e储存在记忆?

有人能帮我吗 ?谢谢 .

Ton*_*roy 12

抛出的对象通常被复制/移动到或保存在为它们保留的存储区中 - 与正常的函数调用堆栈和"堆"不同.因此,不能期望本地str对象some_function()的地址与捕获的字符串实例的地址匹配main().此模型允许抛出的对象的生命周期与堆栈展开分离,直到它们被捕获为止.(这也意味着它可能是可能的-你要检查你的实现文档,如果你关心-甚至抛出一个异常时,剩余的堆栈和/或堆不足以保存抛出的价值,尽管许多异常对象进一步使用动态存储 - 例如,对于std::string文本长于任何内部短字符串优化缓冲区的对象).

见15.1/4:

除非在3.7.4.1中指出,否则异常对象的内存以未指定的方式分配.

在3.7.4.1中:

[注意:对于类型为std :: type_info的对象,对于具有线程存储持续时间(3.7.2)的对象或引用,不调用全局分配函数来为具有静态存储持续时间(3.7.1)的对象分配存储(5.2.8),或异常对象(15.1). - 尾注]