缺少返回语句的非 void 函数的返回值是多少?



我有一个简单的函数,它充当指向对象的指针的getter

wxAuiNotebook* Frame::GetNoteBook(unsigned short index)
{
NotebooksContainer->GetBook(index);
}

我忘了在上面的简单函数中写return关键字,并编译了它,它成功地运行了。

然后我发现缺少一个return关键字,所以我启动了GDB,试图了解这是如何工作的,我发现函数实际上返回了所需的指针。


实验#1

我尝试过更简单的例子

class A {
private:
std::string* pstr;
public:
std::string* GetPstr()
{
std::cout << pstr << std::endl;
pstr;
}
void SetPstr(std::string* val)
{
pstr = val;
}
};
int main() {
A a;
std::string jfox("This is Jumping Fox");
a.SetPstr(&jfox);
std::cout << a.GetPstr() << std::endl;
return 0;
}

GCC编译器在编译过程中不会抛出错误,但对象的地址完全不同。我在G++4.3.3 下得到了以下输出

0x7fff547ce790
0x6012a0

注:同样的简单示例在MSVC 2015下抛出错误。


据我所知,一些语言(例如Ruby)会返回函数最后一条语句的结果作为返回值,但这不适用于C++。

为什么在原始示例中返回相同的指针,为什么在简单示例中返回不同的指针?

我对更多的实验持开放态度。

这是一种未定义的行为。在许多情况下,它看起来像是在工作,因为要返回的值存在于预期的位置(如x86/x64上的CPU寄存器EAX),但这是巧合,没有什么可以依赖的。

最新更新