簡體   English   中英

使用向量(STL)時出現不確定的行為,請解釋以下原因后面的代碼輸出

[英]Undefined behavior while using vectors (STL), Please explain the below code output behind reason

這可能與某些編譯器/ OS一起工作,而與其他編譯器/ OS一起崩潰。 與“列表”相同的代碼可以正常工作,而僅使用“向量”時,我面臨着未定義的行為輸出。 STL(向量)安全嗎?

注意:這不是實時代碼,我只是通過一些示例程序來完成。

#include <vector>
#include <iostream>

using namespace std;

int main() {
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);
  for (vector<int>::iterator i = v.begin();
       i != v.end(); i++) {
    cout << *i << endl;
    if (*i == 1) {
      v.push_back(5);
    }
  }
}

向量輸出:1 0 3 4 0 0 4113 0 858851888 943206709 2617。 1 2 3 4 5 5

#include <list>
#include <iostream>

using namespace std;

int main() {
  list<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);
  for (list<int>::iterator i = v.begin();
       i != v.end(); i++) {
    cout << *i << endl;
    if (*i == 1) {
      v.push_back(5);
    }
  }
}

輸出列表:1 2 3 4 5

循環中的行:

v.push_back(5);

可能會使迭代器i無效(在需要重新分配的情況下),因此從那時起++i就成為未定義的行為。

解決此問題的一種可能性是先保留向量,這樣就不會發生重新分配:

  vector<int> v;
  v.reserve(5); // reserve enough to keep all the pushed items
  v.push_back(1);
  ...

您缺少的概念是“迭代器無效”。 std::vector只是一個具有有限容量的動態數組。 當添加新元素導致數組大小大於容量時,需要進行重新分配,這會使向量的所有迭代器失效。 這在標准草案的“ 23.3.7.5矢量修飾符”部分中進行了定義,其中討論了insertpush_back

備注:如果新大小大於舊容量,則導致重新分配。 如果沒有發生重新分配,則插入點之前的所有迭代器和引用均保持有效。

另一方面, std::list是一個雙向鏈接列表。 因此,列表中已經存在的任何元素都不需要重新分配,只有std::list<T>::end()迭代器無效。 但是,由於您是在循環條件下調用該方法,因此您的代碼恰好可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM