首页 > 解决方案 > 使用指向向量中元素的指针是否危险?

问题描述

我有一个向量,里面装满了对象:

std::vector<MyClass> vec;
vec.push_back(MyClass("Hi", 10)); //example, could be any class

后来,当它被填满时,我想访问它:

for(unsigned int i = 0; i < vec.size(); i++)
{
  MyClass *c = & vec.at(i); // <--- HERE
  if(c)                     // <--- AND HERE 
  {
    c->memberOfMyClass = x;
  }
}

使用 c 比直接使用 vec.at(i) 更危险吗?我需要 if(c) 的保护吗?c可以是nullptr吗?我猜不,因为向量确实接受对象,而不是指向对象的指针。

标签: c++pointers

解决方案


您获取的指针&不能为空,因此没有危险,也没有检查的意义。

(您可能正在考虑,如果向向量添加或删除元素,指向元素的指针可能会变得无效,但它永远不会变为空,并且您无法检测到这一点。)

在这种情况下使用引用是很常见的:

MyClass& c = vec.at(i);
c.member = x;

但是对于您的特定循环,请考虑使用范围循环:

for (auto& c : vec)
{
    c.member = x;
}

推荐阅读