返回静态局部变量作为引用

Returning static local variables as references

本文关键字:引用 局部变量 静态 返回      更新时间:2023-10-16

当静态变量作为引用返回并作为指针直接传递到另一个函数时会发生什么?显然,变量在函数返回后仍然存在,但是关于整个概念的某些事情只是困扰着我。在什么时候释放由静态变量占用的数据顺序上的内存?运行时是否会神奇地注意到我不再需要它,比如某种垃圾回收?

举个例子:

SDL_Rect* XSDL_RectConstr(int x, int y, int w, int h)
{
    static SDL_Rect rect;
    rect.x = x;
    rect.y = y;
    rect.w = w;
    rect.h = h;
    return ▭
}
void mainLoop()
{
    while(isRunning)
    {
        pollEvents();
        SDL_BlitSurface(someSurface, XSDL_RectConstr(0, 0, 100, 100), screen, NULL);
        SDL_Flip(screen);
    }
}

SDL_BlitSurface() 返回后rect会怎样?我看不出它什么时候会被释放。那这不是某种内存泄漏吗?

此时是数据序列上的内存,由 静态变量,释放?运行时是否神奇地注意到当我没有 不再需要它,就像某种垃圾收集一样?

它将在程序退出时释放,而不是更早。此外,还可以保证调用析构函数。

没有内存泄漏,但这是一个非常非常糟糕的主意。假设你写了一些这样的代码

SDL_someFunction(
    XSDL_RectConstr(0, 0, 100, 100), 
    XSDL_RectConstr(20, 20, 30, 30)
);

因为你只有一个静态矩形,所以SDL_someFunction不会得到它看起来会得到的不同矩形。相反,您将获得两次相同的矩形。

rectSDL_BlitSurface返回时不会被释放,但它也不会是内存泄漏:它在静态存储中,所以没有什么可以"泄漏"的。只要程序正在运行,该对象就会保留在内存中。

当你开始多线程

时,最大的缺点会发生:你的静态变量有同时从多个线程修改的风险,这是你宁愿避免的。

静态存储持续时间的初始化对象(在块范围或命名空间范围内声明)的析构函数由于从 main 返回和调用 exit 而调用