我有一个std::unordered_map<int, std::string>
和一个函数GetString(int key)
,该函数需要一个int键,并从此映射返回一个字符串值。
当在地图上找不到键时,我必须返回一个空字符串。
#include <iostream>
#include <string>
#include <unordered_map>
std::unordered_map<int, std::string> map
{
{ 5, "somelongstring" }
};
const std::string& GetString(int key)
{
auto iterator = map.find(key);
if (iterator == map.end())
{
return "";
}
return iterator->second;
}
int main()
{
std::cout << GetString(1) << std::endl;
}
问题是编译器给我这个警告
warning C4172: returning address of local variable or temporary
(使用MS Visual Studio 2013)或
warning: returning reference to temporary [-Wreturn-local-addr]
(使用g ++ 4.9.2)
摆脱这种情况的一种方法是static const std::string
,在顶部声明a并返回该值,而不是空字符串文字
static const std::string Empty = "";
const std::string& GetString(int key)
{
auto iterator = map.find(key);
if (iterator == map.end())
{
return Empty;
}
return iterator->second;
}
但是定义一个空的字符串文字似乎并不干净。有没有一种整洁的方式做到这一点?
更新:我的地图在启动过程中初始化了一次,然后从多个线程同时读取(使用GetString
)。使用函数静态空字符串将不起作用,因为在Visual Studio的编译器中,函数静态变量不是以线程安全的方式初始化的。
警告消息显式地说明了问题所在:您正在返回本地变量(""
“)的地址,该地址将在函数返回后从堆栈中释放。最好返回a std::string
,因为您将在函数局部变量,但是当您返回a时,std::string&
您确实使用了局部变量。
但是,当您返回静态值时,只需将其设为静态:
const std::string& GetString(int key)
{
static const string empty = "";
auto iterator = map.find(key);
if (iterator == map.end())
{
return empty;
}
return iterator->second;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句