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

时间:2012-06-19 07:09:54

标签: c++ crash return return-value return-type

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

4 个答案:

答案 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对象。

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