Search code examples
c++referencedangling-pointer

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
    }