这段代码如何访问C++函数外的局部变量?

How this piece of code accessing the local variable outside the C++ function?

int * addition(int arr[])
{
    int sum=0;
    for(int i=0;i<4;i++)
    sum+=arr[i];
    return &sum;
}

int main()
{
    int arr[4]{1,3,4,5}, * ptr=addition(arr);
    cout<<*ptr<<endl;
    return 0;
}

由于变量 sum 是函数 addition 的局部变量,所以一旦程序控制移出函数,变量就应该被销毁,但它仍然给出输出 13.为什么?

Compiler: g++ 4.8.2 on Ubuntu 14.04 LTS

变量和在堆栈上。当函数 addition() returns 它不会将释放的堆栈内存清零,因此返回的地址仍然包含总和。

如果使用 -O3 启用优化,它仍然有效吗?