#include <iostream>
#include <string>
using namespace std;
string
crash()
{
}
int
noCrash()
{
}
int
main()
{
crash(); // crashes
// noCrash(); // doesn't crash
return 0;
}
函数crash(),与Mingw g ++ 4.6.2崩溃,函数noCrash()执行没有问题。为什么在没有return语句的情况下函数返回字符串崩溃?
答案 0 :(得分:7)
两者都是未定义的行为,即使noCrash
也可能崩溃。
答案 1 :(得分:7)
从标准6.6.3 / 2
没有表达式的return语句只能在函数中使用 不返回值,即返回类型的函数 void,构造函数(12.1)或析构函数(12.4)。退货声明 表达式为非void类型只能在函数中使用 返回一个值;表达式的值返回给 函数的调用者。该表达式被隐式转换为 返回它出现的函数的类型。退货声明 可以涉及临时物体的构造和复制(12.2)。 从函数末尾流出相当于没有返回 值;这会导致值返回时出现未定义的行为 功能强>
答案 2 :(得分:6)
其中很多都是未定义的,但它可以帮助理解这些观察的实际原因 - 它可以帮助进行故障排除甚至性能和空间设计。
因此,在实际意义上,如果函数无法返回值,则基本上无法设置调用者期望该值的寄存器或内存;它似乎返回了那里的垃圾。如果返回类型是int,你只是给自己一个垃圾值,但对于字符串,你有一个垃圾值,意味着(直接或间接)指向字符串用来存储文本值的堆内存,可能还有一些参考柜台或其他管理数据。稍后在程序中,调用代码将尝试通过删除指针来释放该堆内存。删除带有垃圾值的指针很可能会导致程序崩溃。
答案 3 :(得分:4)
可能是因为当您调用crash
时,编译器会尝试销毁从未创建的临时std::string
对象。
由于这两个函数都有未定义的行为,推测有点徒劳。