C++ 返回在函数范围内声明的引用

标签 c++ function

<分区>

Possible Duplicate:
Can a local variable's memory be accessed outside its scope?

我在做一些代码审查时看到了一个函数。

wchar_t* GetString(HINSTANCE hInstance, UINT SID)
{
    wchar_t buf[2048] = {0}; 
    LoadStringW(hInstance, SID, buf, sizeof(buf)/sizeof(wchar_t));
    return &buf[0];
}

void SomeWork()
{
    std::wstring str( GetString(hInst, 123) );
}

我认为 buf 应该在函数返回后立即销毁, 所以指针 &buf[0] 可能无效。 但它似乎工作正常,它是如何工作的? 这是一个很好的设计吗? 谢谢。

最佳答案

I thought buf should be destroyed right after function return, so the pointer &buf[0] might be invalid.

您的想法 100% 正确。

But it seems work fine, how does it work?

它“有效”是因为保存 buf 数组的调用堆栈部分在您实际使用它时恰好没有覆盖其内容。

但这是未定义的行为,未定义的行为意味着任何事情都可能发生,这可能包括“召唤世界末日”和/或“工作得很好”。这次你很幸运。

And is it a fine design?

不,这是一个糟糕的设计。幸运的是,它有一个简单的修复:只需返回 std::wstring 本身。

std::wstring GetString(HINSTANCE hInstance, UINT SID) 
{ 
    wchar_t buf[2048] = {0};  
    LoadStringW(hInstance, SID, buf, sizeof(buf)/sizeof(wchar_t)); 
    return std::wstring(buf);
} 

void SomeWork()   
{   
    std::wstring str = GetString(hInst, 123);   
}  

在这种情况下,所有非愚蠢的 C++ 编译器都会优化临时对象,因此这段代码在实践中没有性能损失。事实上,即使您关闭所有优化,Visual C++ 编译器也会优化这种情况。

此特定优化称为 return value optimization (RVO) .如果您的 C++ 编译器即使设置为最高优化级别也不执行 RVO,请换一个。

关于C++ 返回在函数范围内声明的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12276114/

相关文章:

javascript - 将值传递给具有多个默认参数的函数

php - 没有被重定向到登录

c++ - 在指定其他参数时使用前导参数的默认值

c++ - 如何使用 OpenGL/GLUT 显示文本和一些点?

C++ 将 typedef 与 LegacyRandomAccessIterator 一起使用

c++ - 这在 c int a :16;? 中意味着什么

C++:无法将 'float (*)()' 转换为 'float'

c++ - 类构造函数上的调用错误没有匹配函数

JavaScript 函数参数与对象方法

C++ 获取成员函数的类型(返回类型和签名),不带成员函数的 'const' 限定符