mam*_*don 5 c++ boost reference
我有一个任何指针的地图,称为gmap,定义如下:
std::map<std::string, boost::any*>& gmap = getSingleton().globalValues;
Run Code Online (Sandbox Code Playgroud)
这个地图确实是对globalValues的引用,我已经检查了gdb中的地址.我也控制了任何指针(这就是为什么它们是指针,我宁愿做引用,但我现在正在调试).现在,然后我用与gmap相同的方法返回:
return boost::any_cast<T&>(*gmap[key]);
Run Code Online (Sandbox Code Playgroud)
看着&boost :: any_cast [T&] [*gmap [key]]的内存,一旦我弹出那个堆栈帧,数据就会变坏.这很奇怪,因为根据:
返回:如果传递了指针,如果成功则返回一个类似限定值的内容,否则返回null.如果T是ValueType,则返回保持值的副本,否则,如果T是对(可能是const限定的)ValueType的引用,则返回对保持值的引用.
因此,根据我的理解,这不应该返回对局部变量的引用.
这很奇怪,但我想通了。
忽略它说如果 T 是引用,它将返回一个这一事实;我向它传递了一个指针并得到了正确的指针。但无论出于何种原因,我不能只是取消引用返回值并返回。首先,我必须将该指针存储在显式本地(而不是隐式)中,取消引用并返回。
return *boost::any_cast<T>(&gmap[key]);
Run Code Online (Sandbox Code Playgroud)
导致不正确的行为
T* ret = boost::any_cast<T>(&gmap[key]);
return *ret;
Run Code Online (Sandbox Code Playgroud)
产生正确的行为。
不知道为什么,因为据我所知,本地仅在底部示例中显式声明。另外,gmap 现在是:
map<std::string, boost::any>
Run Code Online (Sandbox Code Playgroud)
因为我现在不需要拥有任何物体。
| 归档时间: |
|
| 查看次数: |
2621 次 |
| 最近记录: |