我对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)
在我的电脑上调试:
some_function
该str
地址:0x003CF820
main
的e
地址:0x003CF738
我有三个问题,
string&
,为什么我们在main()中得到diff addr? str
不是一个临时的价值?为什么我们可以使用临时值参考?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). - 尾注]
归档时间: |
|
查看次数: |
224 次 |
最近记录: |