当作为引用返回并作为指针直接传递给另一个函数时,静态变量会发生什么?显然,变量在函数返回后仍然存在,但关于这整个概念的一些事情让我感到烦恼。在哪一点上是由静态变量占用的数据后续内存,释放?当我不再需要它时,运行时会神奇地注意到它,比如某种垃圾收集吗?
举个例子:
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
会发生什么?我看不出它什么时候会被释放。那么这不会是某种内存泄漏吗?
答案 0 :(得分:12)
在哪一点上是数据后续的内存,被占用 静态变量,释放?当我没有时,运行时会神奇地注意到 是否需要它,就像某种垃圾收集一样?
它会在程序退出时释放,而不是更快。此外,它保证将调用析构函数。
答案 1 :(得分:5)
rect
返回时, SDL_BlitSurface
将不会被释放,但它也不会是内存泄漏:它位于静态存储中,因此没有任何“泄漏”。只要程序正在运行,对象就会保留在内存中。
当您启动多线程时,最大的缺点就是:您的静态变量存在同时从多个线程进行修改的风险,这是您宁愿避免的。
答案 2 :(得分:5)
没有内存泄漏,但这是真的,非常糟糕的主意。假设你写了一些像这样的代码
SDL_someFunction(
XSDL_RectConstr(0, 0, 100, 100),
XSDL_RectConstr(20, 20, 30, 30)
);
因为你只有一个静态矩形,SDL_someFunction
不会得到它看起来会得到的不同矩形。相反,你会得到两次相同的矩形。