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,请换一个。