看到这段代码:
std::deque<BIG> bigs {};
// add some BIGs in the deque
BIG& last_BIG { bigs.front() };
f(last_BIG);
bigs.pop_front();
g();
在pop_front
调用后,引用last_BIG
无效,这是否足以使程序格式错误?换句话说,我是否必须将last_BIG
放在较小的范围内?
当然使用 last_BIG
在弹出后未定义。
答案 0 :(得分:4)
不,无效的引用或无效的指针本身并不会使程序无效。在它变得无效之后使用它肯定是未定义的,但创建它本身并不是一个问题。
这类似于创建悬挂指针,除了指针提供了更多使它们无效的方法:
int *a = new int;
delete a;
此时a
是无效指针,与代码pop_front
中last_BIG
之后的无效引用相同。这没关系,只要您不取消引用无效指针或访问无效的引用。
答案 1 :(得分:0)
实质上,当你使用&amp;你正在获取一个BIG对象的内存地址。如果内存地址在堆中(用新建),那么你没事。另一方面,如果它是堆栈上的引用,那么一旦你离开当前所在的函数,这将在技术上无效。无论如何,必须声明对象,并且必须为它分配内存。
所以不,这不会使last_BIG失效。