15

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

举个例子:

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

rectSDL_BlitSurface() 返回后会发生什么?我看不到它什么时候会被释放。那这不是某种内存泄漏吗?

4

3 回答 3

13

数据序列上被静态变量占用的内存在哪一点被释放?当我不再需要它时,运行时是否会神奇地注意到它,比如某种垃圾收集?

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

于 2012-11-16T21:22:26.190 回答
6

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

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

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

于 2012-11-16T21:27:05.233 回答
5

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

当您开始多线程时,最大的缺点会发生:您的静态变量存在被多个线程同时修改的风险,这是您宁愿避免的。

静态存储持续时间(在块范围或命名空间范围声明)的初始化对象的析构函数作为从 main 返回的结果和调用 exit 的结果被调用。

于 2012-11-16T21:23:05.160 回答