c++ 下面的程序是否包含悬空引用?

velaa5lx  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(91)

我有以下程序:

#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编译了这个引用,它编译得很好,产生了预期的输出。

5n0oy7gb

5n0oy7gb1#

不,arrg具有相同的生存期,因此没有悬空引用。
但是请注意,您 * 可以 * 轻松地用函数创建悬空引用:

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
}

相关问题