for(auto it : csm.states){
if(it.stateName == std::get<StateName>(e.eventData)){
destState = ⁢
return destState;
}
}
在这里,it 是 csm.states 集合元素的拷贝。当你用 &it 获取 it 的地址时,你实际上获取的是这个拷贝元素的地址,而不是集合中元素的地址。当函数结束后,这个拷贝就会被销毁,所以你返回的指针就变成了悬空指针,也就是说,它指向的内存可能已经被重新分配给其他数据了。
解决这个问题的一种方式是不使用范围for循环(也就是不使用for : ),而是使用迭代器。这是修改后的示例:
for(auto it = csm.states.begin(); it != csm.states.end(); ++it){
if(it->stateName == std::get<StateName>(e.eventData)){
destState = &(*it);
return destState;
}
}
通过这种方式,it 是一个迭代器,指向 csm.states 中的实际元素。所以,&(*it) 给出的是实际元素的地址,而不是临时拷贝的地址。当函数返回时这个地址依然有效。