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

C++ 返回静态局部变量作为引用,c++,memory-management,static,local,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.

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

举个例子:

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

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


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

rect
从SDL\u BlitSurface返回时不会被释放,但也不会发生内存泄漏:它位于静态存储器中,因此没有任何“泄漏”。只要您的程序在运行,对象就会一直保留在内存中

这种情况的最大缺点发生在您开始多线程处理时:您的静态变量有被多线程并发修改的风险,这是您希望避免的


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

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

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

因此它仍然会占用大量内存,因为它在无限循环中运行,对吗?还是每次调用XSDL_rectcontr()时它都会覆盖自身?此外,SDL_rect是一个结构,而不是一个类,因此没有析构函数,但我想这是不相关的。它会覆盖自身,这就是问题所在。每一个结构(和每一个类)都有一个析构函数,如果你不写一个,就会生成一个默认的析构函数,它不会“覆盖”任何东西。是同一个物体。这里唯一的神奇之处在于,直到您第一次进入该函数时,它才被构造;除了通常的作用域规则外,这与在命名空间范围中定义的
静态
没有什么不同。它类似于函数的静态“成员”。@LightnessRacesinOrbit是的,因此对
XSDL_rectcontr
的第二次调用将覆盖第一次调用
XSDL_rectcontr
所设置的值。@john:好的,好的。但“覆盖自身”是不正确的。函数中的以下行?当然,他们正在给同一个原始对象的成员赋值。我可以通过在函数周围使用互斥锁来解决多线程问题,对吗?@cyberpunk_uu;是的,这是正确的。互斥体需要围绕函数的调用,并包含使用静态变量的值以及调用本身的代码。因此,我想如果我使用互斥体来确保始终获得相同的数据,这没关系,对吗?