【问题标题】:where C++ exception parameter store in memory?C++ 异常参数存储在内存中的哪个位置?
【发布时间】:2014-01-07 08:04:29
【问题描述】:

我对 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;
}

在我的电脑上调试:

  1. some_functionstr 地址:0x003CF820
  2. int main e 地址:0x003CF738

我有三个问题,

  1. catch 参数是string&amp;,为什么我们在 main() 中得到 diff addr ?
  2. str 不是临时值吗?为什么我们可以使用临时值引用?
  3. e 存储在内存中的什么位置?

有人可以帮我吗?谢谢。

【问题讨论】:

标签: c++


【解决方案1】:

抛出的对象通常被复制/移动到为它们保留的内存区域中,或者直接在其中构造 - 与正常的函数调用堆栈和“堆”不同。因此,不能期望some_function() 中的本地str 对象的地址与main() 中捕获的字符串实例的地址相匹配。该模型允许将抛出对象的生命周期与堆栈展开分离,直到它们被捕获。 (这也意味着它可能有可能——如果你愿意的话,你会想检查你的实现文档——即使在剩余的堆栈和/或堆不足以存储抛出的值,尽管许多异常对象使用进一步的动态存储 - 例如,对于文本长于任何内部短字符串优化缓冲区的 std::string 对象)。

见 15.1/4:

异常对象的内存以未指定的方式分配,除非在 3.7.4.1 中注明。

在 3.7.4.1 中:

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

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 2015-08-25
    • 2023-03-29
    • 1970-01-01
    • 2017-08-27
    • 2011-10-20
    • 2013-08-03
    相关资源
    最近更新 更多