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

Byz*_*ian 13 c++ static memory-management 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

hat*_*ine 12

此时是数据后续的内存,被静态变量占用,被释放了吗?当我不再需要它时,运行时会神奇地注意到它,比如某种垃圾收集吗?

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

  • 它不会“覆盖”任何东西。这是同一个对象。这里唯一的神奇之处在于它直到您第一次进入该函数时才被构造;除了通常的范围规则之外,这与命名空间范围中定义的“静态”没有什么不同。它就像函数的静态“成员”。 (3认同)
  • @john:对,那个,好的。但是“覆盖_itself_”是不正确的。函数中的以下几行?当然,他们正在为同一个原始对象的成员赋值。 (2认同)

das*_*ght 5

rect在返回时不会释放SDL_BlitSurface,但它也不会是内存泄漏:它在静态存储中,因此没有任何"泄漏".只要程序正在运行,对象就会保留在内存中.

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

静态存储持续时间的初始化对象的析构函数(在块作用域或命名空间作用域中声明)作为从main返回并由于调用exit而被调用.


joh*_*ohn 5

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

SDL_someFunction(
    XSDL_RectConstr(0, 0, 100, 100), 
    XSDL_RectConstr(20, 20, 30, 30)
);
Run Code Online (Sandbox Code Playgroud)

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