The*_*uzz 3 c++ crash return return-type return-value
#include <iostream>
#include <string>
using namespace std;
string
crash()
{
}
int
noCrash()
{
}
int
main()
{
crash(); // crashes
// noCrash(); // doesn't crash
return 0;
}
Run Code Online (Sandbox Code Playgroud)
函数crash(),与Mingw g ++ 4.6.2崩溃,函数noCrash()执行没有问题.为什么在没有return语句的情况下函数返回字符串崩溃?
从标准6.6.3/2
不带表达式的return语句只能用于不返回值的函数,即返回类型为void的函数,构造函数(12.1)或析构函数(12.4).表达式为非void类型的return语句只能用于返回值的函数; 表达式的值返回给函数的调用者.表达式隐式转换为它出现的函数的返回类型.return语句可以包含临时对象的构造和复制(12.2). 流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.
其中很多都是未定义的,但它可以帮助理解这些观察的实际原因 - 它可以帮助进行故障排除甚至性能和空间设计.
因此,在实际意义上,如果函数未能返回值,则基本上无法设置调用者期望该值的寄存器或内存; 它似乎返回了那里的垃圾.如果返回类型是int,你只是给自己一个垃圾值,但对于字符串,你有一个垃圾值,意味着(直接或间接)指向字符串用来存储文本值的堆内存,可能还有一些参考柜台或其他管理数据.稍后在程序中,调用代码将尝试通过删除指针来释放该堆内存.删除带有垃圾值的指针很可能会导致程序崩溃.
| 归档时间: |
|
| 查看次数: |
811 次 |
| 最近记录: |