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

时间:2012-11-16 21:19:53

标签: c++ memory-management static local

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

举个例子:

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会发生什么?我看不出它什么时候会被释放。那么这不会是某种内存泄漏吗?

3 个答案:

答案 0 :(得分:12)

  

在哪一点上是数据后续的内存,被占用   静态变量,释放?当我没有时,运行时会神奇地注意到   是否需要它,就像某种垃圾收集一样?

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

答案 1 :(得分:5)

rect返回时,

SDL_BlitSurface将不会被释放,但它也不会是内存泄漏:它位于静态存储中,因此没有任何“泄漏”。只要程序正在运行,对象就会保留在内存中。

当您启动多线程时,最大的缺点就是:您的静态变量存在同时从多个线程进行修改的风险,这是您宁愿避免的。

Destructors for initialized objects of static storage duration (declared at block scope or at namespace scope) are called as a result of returning from main and as a result of calling exit.

答案 2 :(得分:5)

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

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

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