将指针保存到循环中的向量中的对象

时间:2013-04-02 12:50:30

标签: c++ pointers vector

是否可以在循环内的向量中保存指向对象的指针?

例如:

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 = *它,它就会因访问冲突而崩溃。

4 个答案:

答案 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);