Does the following program contain a dangling reference?

I have the following program:

#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;
}

Is arr[index] returned by f considered a dangling reference?

I don’t think this is a dangling reference since the arr object continues to exist even after f returns (so the reference is valid), but I wanted to confirm my understanding. I compiled this with -fsanitize=undefined and it compiled fine and produced the expected output.

>Solution :

No, arr and g have the same life time, so there’s no dangling reference.

Note however that you can easily create a dangling reference with your function:

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
}

Leave a Reply