我有一个名为gmap的任何指针的地图,定义如下:
std::map<std::string, boost::any*>& gmap = getSingleton().globalValues;
这个地图确实是对globalValues的引用,我检查了gdb中的地址。 我也控制了任何指针(这就是为什么它们是指针,我宁愿做引用,但我现在正在调试)。 现在,我用与声明gmap相同的方法返回它:
return boost::any_cast<T&>(*gmap[key]);
在&amp; boost :: any_cast [T&amp;] [* gmap [key]]中观察内存,一旦我弹出该堆栈帧,数据就会变坏。这很奇怪,因为根据:
Boost's documentation of any_cast
返回: 如果传递了一个指针,它会在成功时返回一个类似限定值的指针,否则返回null。如果T是ValueType,则返回保持值的副本,否则,如果T是对(可能是const限定的)ValueType的引用,则返回对保持值的引用。
因此,根据我的理解,这不应该返回对局部变量的引用。
答案 0 :(得分:4)
这很奇怪,但我明白了。
忽略它说T是参考的事实,它会返回一个;我传了一个指针,得到了正确的指针。但无论出于何种原因,我不能只取消引用返回值和返回值。首先,我必须将该指针存储在显式本地(而不是隐式)中,取消引用并返回。
return *boost::any_cast<T>(&gmap[key]);
导致行为不正确
T* ret = boost::any_cast<T>(&gmap[key]);
return *ret;
导致正确的行为。
不知道为什么,因为AFAIK本地只在底部示例中明确声明。 此外,gmap现在是:
map<std::string, boost::any>
因为我现在不需要拥有任何对象。