是否可以在循环内的向量中保存指向对象的指针?
例如:
rpc::session* session=NULL;
//Find Sessions with same UserID, Remove if > 1
for(std::vector<rpc::session>::iterator it = session_manager::sessions.begin(); it != session_manager::sessions.end();) {
if(it->userid == userid){
if(session == NULL) {
*session = *it;
++it;
} else {
it = session_manager::sessions.erase(it);
}
} else {
++it;
}
}
代码被编译但是一旦到达* session = *它,它就会因访问冲突而崩溃。
答案 0 :(得分:2)
因为您没有将session
的地址分配给session
变量,并且看到您的向量存储会话对象而不是指针,您需要将变量的地址分配给您的指针。
session = &(*it);
这会将*it
中的内容分配给session
答案 1 :(得分:2)
那是因为你试图取消引用NULL
指针。如果要保存指向该对象的指针,则需要指定指针session
本身 - session = &(*it)
。
答案 2 :(得分:2)
这是因为您尝试将会话对象的内容复制到nullptr中。您必须分配内存并复制到该内存中或将指针复制到另一个位置。
请注意,在向量中获取元素的地址并不是一个好的解决方案,因为vector :: erase()会移动向量中的元素,使先前存储的地址无效。
在您的情况下它可能仍然有效,因为您将仅存储向量中找到的最后一个会话。如果您想使用正确的用户ID存储所有会话,则需要执行类似
的操作std::vector<rpc::session> result;
std::copy_if(session_manager::sessions.begin(),
session_manager::sessions.end(),
result.begin(),
[&](rpc::session s) -> bool
{
return s.userid == userid;
}
);
答案 3 :(得分:1)
你可以获得一个指向向量中元素的指针,但你对*session = *it;
所做的事情并不是获取指向该元素的指针,而是获取其值并尝试将其复制到另一个rpc::session
从未分配的对象。
如果你想指向向量中的rpc::session
对象,你应该做
session = &(*it);