迭代解引用向量安全吗?

Is it safe to iterate a dereferenced vector?

本文关键字:安全 向量 引用 迭代      更新时间:2023-10-16
std::vector<int>* someVector;
// Initialize vector here and add elements
//****
// Now loop vector after initializing it
for (int val : *someVector)
 {
     doSomething(val);
 }

在上面的例子中,像这样迭代一个向量安全吗?

解引用不是这里的问题,

std::vector<int>* v = new std::vector<int>;
v->push_back(1);
for (int val : *v) {
}

上面的代码是完美的,但是你所展示的代码并没有表明someVector是否被初始化或者是否可能被反初始化。

问题实际上是指针是否有效。如果你知道指针是有效的,那么对它解引用是可以的,不管它是vector、list、map还是整型。

std::vector<int>* v = new std::vector<int>;
v->push_back(1);
delete v;
for (int val : *v) {
}

代码将编译并可能运行,但它所做的完全是未定义行为。

在上面的例子中,像这样迭代一个向量安全吗?

不,不是。

在进入循环之前,显然应该检查至少

someVector != nullptr

,并确保在声明后正确初始化。

或者直接初始化指针。

std::vector<int>* someVector = new std::vector<int>();

更好的问题是,为什么在那里使用std::vector<int>*指针?