Jas*_*son 9 c++ pointers stdmap
将指针从a返回std::map::find到数据并使用它而不是获取数据副本是危险的吗?
目前,我得到一个指向我的地图中的条目的指针,并将其传递给另一个函数来显示数据.我担心项目移动导致指针变为无效.这是一个合法的问题吗?
这是我的示例函数:
MyStruct* StructManagementClass::GetStructPtr(int structId)
{
std::map<int, MyStruct>::iterator foundStruct;
foundStruct= myStructList.find(structId);
if (foundStruct== myStructList.end())
{
MyStruct newStruct;
memset(&newStruct, 0, sizeof(MyStruct));
myStructList.structId= structId;
myStructList.insert(pair<int, MyStruct>(structId, newStruct));
foundStruct= myStructList.find(structId);
}
return (MyStruct*) &foundStruct->second;
Run Code Online (Sandbox Code Playgroud)
}
毫无疑问,返回迭代器而不是指针更为典型,尽管它可能没什么区别.
至于剩余有效:地图迭代器保持有效,直到/除非它引用的项目从地图中删除/删除.
在地图中插入或删除其他节点时,可能会导致地图中的节点重新排列.这是通过操纵节点之间的指针来完成的,因此它会更改其他节点包含指向您关注的节点的指针,但不会更改该特定节点的地址或内容,因此指向该节点的指针/迭代器仍然有效.