C++ std::map是否丢失了我的数据?

C++ std::map是否丢失了我的数据?,c++,map,reference,pass-by-reference,C++,Map,Reference,Pass By Reference,我将一些用boost::any包装的数据粘贴到类方法getValue中的映射中。一切正常,数据在地图中,如适用,等等,在getValue中。当我第二次离开getValue并尝试使用这些数据时,它就不再在地图中了 这让我很困惑,我可能忘记在关键点使用参考资料,但我找不到 有关守则如下: 测试c //我们不想实际记录计时器,如果用户愿意,可以这样做。 timeval-tmp tmp.tv_sec = 0; tmp.tv_usec = 0; gettimeofday(&tmp,

我将一些用boost::any包装的数据粘贴到类方法getValue中的映射中。一切正常,数据在地图中,如适用,等等,在getValue中。当我第二次离开getValue并尝试使用这些数据时,它就不再在地图中了

这让我很困惑,我可能忘记在关键点使用参考资料,但我找不到

有关守则如下:

测试c //我们不想实际记录计时器,如果用户愿意,可以这样做。 timeval-tmp

  tmp.tv_sec = 0;
  tmp.tv_usec = 0;

  gettimeofday(&tmp, NULL);
  getValue<timeval>(timerName) = tmp;
  std::cout << tmp.tv_usec << " : " << getSingleton().globalValues.count(key) << std::endl; //Count returns 0 here, for a given key X_X
tmp.tv_sec=0;
tmp.tv_usec=0;
gettimeofday(&tmp,NULL);
getValue(timerName)=tmp;

std::cout在这些行中,您使用
vmap
而不是
gmap
。是这样吗

if(checkValue(identifier)) //If we have the option, set it's value
  tmp = getSingleton().vmap[identifier].as<T>();
if(checkValue(identifier))//如果我们有这个选项,设置它的值
tmp=getSingleton().vmap[identifier].as();

我还注意到您正在使用
count
检查项目是否存在。一般来说,除非您确实需要计数,否则这将导致比
find
做更多的工作,尽管对于
std::map
来说,将
count
优化为
find
可能足够聪明。既然您想在它不存在时插入,并且在它存在时没有op,只需使用
insert
,因为这正是
insert
将提供给您的行为。

我解决了这个问题,请注意我如何将getValue中的键定义为std::string(标识符)。在test.c中,我将key定义为sanitizeString(..),它显然返回了一个不同的key。当然,你们看不到这一点,所以我很糟糕。

返回对局部变量的引用???听起来像是,“return boost::any_cast(gmap[key])”返回对boost::any中存储的值的引用。您正在对map gmap的T引用执行any_转换,该引用是一个局部变量。。。(地图中的值也是本地的)通过引用(超出范围)将本地地图返回给调用者…@Tony
gmap
是对全局地图的引用。其中的所有内容在函数范围之外仍然有效。您对getSingleton的定义是什么?是否有可能返回映射的副本而不是对它的引用?vmap仅用于通过命令行定义的可选默认值。对于
std::map
,使用
count
是检查成员资格的更可读的方法。它显然至少与
find
一样有效,因为
count
的实现需要知道它只能返回
0
1
 //Map of global values, stored here instead of in OptionsHierarchy
  //For ease of implementation
  std::map<std::string, boost::any> globalValues;
if(checkValue(identifier)) //If we have the option, set it's value
  tmp = getSingleton().vmap[identifier].as<T>();