3
#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() 执行没有问题。为什么返回字符串的函数在没有返回语句的情况下会崩溃?

4

4 回答 4

7

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

于 2012-06-19T07:12:22.417 回答
7

从标准 6.6.3/2

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

于 2012-06-19T07:14:08.293 回答
6

其中很多是未定义的,但可以说有助于理解这种观察的实际原因——它有助于故障排除,甚至有助于性能和空间设计。

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

于 2012-06-19T07:34:41.963 回答
4

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

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

于 2012-06-19T07:13:40.623 回答