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>*
指针?