迭代一个解除引用的向量是否安全?

时间:2016-09-20 00:41:40

标签: c++ c++11

std::vector<int>* someVector;
// Initialize vector here and add elements
//****
// Now loop vector after initializing it
for (int val : *someVector)
 {
     doSomething(val);
 }

在上面的示例中,迭代这样的矢量是否安全?

2 个答案:

答案 0 :(得分:3)

这里的解除引用不是问题,

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

上面的代码完全正常,但是您显示的代码并不表示someVector是否曾被初始化,或者是否可能已取消初始化。

问题实际上是指针是否有效。如果你知道指针是有效的,那么解引它就可以了,无论是向量,列表,映射还是整数。

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

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

所以“安全”:没有保证。

答案 1 :(得分:2)

  

在上面的示例中,迭代这样的矢量是否安全?

不,不是。

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

curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
    "query": {
        "bool": {
            "should": [{
                "match": {
                    "roles": {
                        "query": "supervisor manager",
                        "operator" : "and"
                    }
                }
            },
            {
              "match": {
                  "roles": {
                    "query" : "employee"
                  }
              }
          }]
        }
    } }'

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

甚至可以更好地直接初始化指针。

someVector != nullptr

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