函数返回std :: string崩溃没有return语句,不像返回int而没有return语句的函数

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语句的情况下函数返回字符串崩溃?

Ash*_*sha 7

两者都是未定义的行为,甚至noCrash可能崩溃.


And*_*nck 7

从标准6.6.3/2

不带表达式的return语句只能用于不返回值的函数,即返回类型为void的函数,构造函数(12.1)或析构函数(12.4).表达式为非void类型的return语句只能用于返回值的函数; 表达式的值返回给函数的调用者.表达式隐式转换为它出现的函数的返回类型.return语句可以包含临时对象的构造和复制(12.2). 流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.


Ton*_*roy 6

其中很多都是未定义的,但它可以帮助理解这些观察的实际原因 - 它可以帮助进行故障排除甚至性能和空间设计.

因此,在实际意义上,如果函数未能返回值,则基本上无法设置调用者期望该值的寄存器或内存; 它似乎返回了那里的垃圾.如果返回类型是int,你只是给自己一个垃圾值,但对于字符串,你有一个垃圾值,意味着(直接或间接)指向字符串用来存储文本值的堆内存,可能还有一些参考柜台或其他管理数据.稍后在程序中,调用代码将尝试通过删除指针来释放该堆内存.删除带有垃圾值的指针很可能会导致程序崩溃.


CB *_*ley 5

可能是因为当您调用crash编译器时尝试销毁std::string从未创建的临时对象。

由于这两个函数都有未定义的行为,猜测有些徒劳。