0

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

例如:

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

4

4 回答 4

2

因为您没有将您的地址分配session给您的session变量,并且看到您的向量存储的是会话对象而不是指针,所以您需要将变量的地址分配给您的指针。

session = &(*it);

这将分配的地址分配*itsession

于 2013-04-02T12:52:24.807 回答
2

那是因为你试图取消引用一个NULL指针。如果要保存指向该对象的指针,则需要分配指针session本身 - session = &(*it)

于 2013-04-02T12:52:59.800 回答
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;
             }
             );
于 2013-04-02T13:07:24.617 回答
1

您可以获取指向向量中元素的指针,但您所做*session = *it;的不是获取指向该元素的指针,而是获取其值并尝试将其复制到另一个rpc::session从未分配的对象。如果你想要指向rpc::session向量中对象的指针,你应该这样做

session = &(*it);
于 2013-04-02T12:54:59.470 回答