【发布时间】:2014-04-02 16:25:19
【问题描述】:
考虑以下代码:
vector<int> test = { 0, 1, 2 };
test.push_back(3);
int& last = test.back();
test.pop_back(); //now last_elem_ref should be invalid, right?
3 == last; //evaluates to true o.O
last = 5; // this works just as fine
我知道不存在对任何内容的引用,但我不知道这是如何工作的。 C++ 没有垃圾收集器或引用计数(当然除了智能指针),所以为什么当对象的所有者转储对象时对象没有被销毁?
还是被销毁了,引用甚至不再引用值了?
什么时候销毁,例如它占用的内存何时会被释放?(我个人的猜测是对象的最后一个引用超出范围。)
【问题讨论】:
-
使用
last是未定义的行为。你不应该对任何结果感到惊讶。 -
@chris 澄清一下,从向量中擦除后使用
last是未定义还是一般未定义? -
@iFreilicht,在它变成一个悬空引用之后。
-
在任何可能导致向量元素重定位的操作之后。例如。
push_back- 如果没有足够的内存并且会发生重定位,引用将无效。pop_back但绝不应该触发重定位,所以从技术上讲它不是 UB。