論Rust for C++ programmers切片6,有這樣的代碼:爲什麼我不能使用std :: vector元素的別名?
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> v;
v.push_back("Hello");
string& x = v[0];
v.push_back("world");
cout << x << endl;
return 0;
}
運行它,我得到:
g++ --std=c++11 main.cpp -I . -o main
./main
P▒▒o▒Y ▒▒2.▒8/.▒H/.▒H/.▒X/.▒X/.▒h/.▒h/.▒x/.▒x/.▒▒/.
@▒▒
...
它不斷地去爲更多的東西。我發現有關別名和載體,爲一些問題:
但是,爲什麼別名不工作基礎上他們,我無法弄清楚。我查看了關於矢量定義的http://en.cppreference.com/w/cpp/container/vector,但它似乎只是在磁盤上分配的內存。我明白Hello
和world
在程序的數據成員分配的地方,因爲在這裏上裝配由g++ main.cpp -S
字符串:
...
.lcomm _ZStL8__ioinit,1,1
.def __main; .scl 2; .type 32; .endef
.section .rdata,"dr"
.LC0:
.ascii "Hello\0"
.LC1:
.ascii "world\0"
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
...
如果我不推的第二個元素world
,該程序運行正常。那麼爲什麼別名在第二次推後失去了對第一個向量元素的引用呢?
瀏覽一下'push_back'頁:http://en.cppreference.com/w/cpp/container/vector/push_back – chris
等等,你讀的幻燈片解釋它。 – chris
對不起,這是'push_back'文檔中第一個說的。 '如果新的size()大於capacity(),那麼所有迭代器和引用(包括過去末端迭代器)都將失效。「真正的問題是他們爲什麼要這樣做。 – user