关于C ++无效引用,是创建还是使用它使程序格式错误?

时间:2014-12-09 14:20:38

标签: c++ c++11 reference

看到这段代码:

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在弹出后未定义。

2 个答案:

答案 0 :(得分:4)

不,无效的引用或无效的指针本身并不会使程序无效。在它变得无效之后使用它肯定是未定义的,但创建它本身并不是一个问题。

这类似于创建悬挂指针,除了指针提供了更多使它们无效的方法:

int *a = new int;
delete a;

此时a是无效指针,与代码pop_frontlast_BIG之后的无效引用相同。这没关系,只要您不取消引用无效指针或访问无效的引用。

答案 1 :(得分:0)

实质上,当你使用&amp;你正在获取一个BIG对象的内存地址。如果内存地址在堆中(用新建),那么你没事。另一方面,如果它是堆栈上的引用,那么一旦你离开当前所在的函数,这将在技术上无效。无论如何,必须声明对象,并且必须为它分配内存。

所以不,这不会使last_BIG失效。