提问人:ktqq99 提问时间:1/14/2023 更新时间:1/14/2023 访问量:49
以下程序是否包含悬空引用?
Does the following program contain a dangling reference?
问:
我有以下程序:
#include <iostream>
#include <string>
using namespace std;
using int_arr = int[3];
int& f(int_arr& arr, int index)
{
return arr[index];
}
int main() {
int arr[3] = {1, 2, 3};
int& g = f(arr, 0);
g = 5;
std::cout << arr[0] << std::endl;
}
f 返回是否被视为悬空引用?arr[index]
我不认为这是一个悬空的引用,因为即使在返回后,该对象仍继续存在(因此引用是有效的),但我想确认我的理解。我编译了它,它编译得很好并产生了预期的输出。arr
f
-fsanitize=undefined
答:
1赞
Blindy
1/14/2023
#1
不,并且具有相同的生命周期,因此没有悬空的引用。arr
g
但请注意,您可以使用函数轻松创建悬空引用:
int empty;
int& ref = empty;
int &f(int arr[], int idx) { return arr[idx]; }
void g()
{
int arr[] = { 1, 2, 3 };
ref = f(arr, 0);
}
int main()
{
g();
// ref is accesable here and complete garbage
}
评论
4赞
Blastfurnace
1/14/2023
我不认为你的例子正确地显示了一个悬空的引用。您无法重新绑定引用,因此内部的赋值只会更改“空”的值。g()
int
下一个:如何寻找悬空指针?
评论
g
arr
main