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
此时是数据后续的内存,被静态变量占用,被释放了吗?当我不再需要它时,运行时会神奇地注意到它,比如某种垃圾收集吗?
它会在程序退出时释放,而不是更快.此外,它保证将调用析构函数.
rect在返回时不会释放SDL_BlitSurface,但它也不会是内存泄漏:它在静态存储中,因此没有任何"泄漏".只要程序正在运行,对象就会保留在内存中.
当您启动多线程时,最大的缺点就是:您的静态变量存在同时从多个线程进行修改的风险,这是您宁愿避免的.
静态存储持续时间的初始化对象的析构函数(在块作用域或命名空间作用域中声明)作为从main返回并由于调用exit而被调用.
没有内存泄漏,但这是一个非常非常糟糕的主意.假设你写了这样的代码
SDL_someFunction(
XSDL_RectConstr(0, 0, 100, 100),
XSDL_RectConstr(20, 20, 30, 30)
);
Run Code Online (Sandbox Code Playgroud)
因为你只有一个静态矩形,SDL_someFunction所以不会得到它看起来会得到的不同矩形.相反,你会得到两次相同的矩形.