论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