返回静态局部变量作为引用
Returning static local variables as references
当静态变量作为引用返回并作为指针直接传递到另一个函数时会发生什么?显然,变量在函数返回后仍然存在,但是关于整个概念的某些事情只是困扰着我。在什么时候释放由静态变量占用的数据顺序上的内存?运行时是否会神奇地注意到我不再需要它,比如某种垃圾回收?
举个例子:
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
会怎样?我看不出它什么时候会被释放。那这不是某种内存泄漏吗?
此时是数据序列上的内存,由 静态变量,释放?运行时是否神奇地注意到当我没有 不再需要它,就像某种垃圾收集一样?
它将在程序退出时释放,而不是更早。此外,还可以保证调用析构函数。
没有内存泄漏,但这是一个非常非常糟糕的主意。假设你写了一些这样的代码
SDL_someFunction(
XSDL_RectConstr(0, 0, 100, 100),
XSDL_RectConstr(20, 20, 30, 30)
);
因为你只有一个静态矩形,所以SDL_someFunction
不会得到它看起来会得到的不同矩形。相反,您将获得两次相同的矩形。
rect
从SDL_BlitSurface
返回时不会被释放,但它也不会是内存泄漏:它在静态存储中,所以没有什么可以"泄漏"的。只要程序正在运行,该对象就会保留在内存中。
时,最大的缺点会发生:你的静态变量有同时从多个线程修改的风险,这是你宁愿避免的。
静态存储持续时间的初始化对象(在块范围或命名空间范围内声明)的析构函数由于从 main 返回和调用 exit 而调用
相关文章:
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 返回对局部变量 - C++ 的引用
- 警告 C4101 未引用的局部变量
- 现代编译器会优化只引用对象子集的局部变量吗
- 右值引用和局部变量的移动
- 结构数组 - 未引用的局部变量
- 返回对局部变量的引用是否正常工作?
- 为什么 ++ 运算符触发器返回对局部变量警告的引用
- 三元运算符:编译器不发出局部变量警告的返回引用
- 为什么 C++ 编译器不警告返回对局部变量的引用
- 变量循环范围会导致返回局部变量的地址引用
- 通过引用返回局部变量
- 为什么我得到未引用的局部变量
- 返回由引用指定的引用局部变量
- 返回静态局部变量作为引用
- 从函数中引用局部变量不会给出错误
- C++按引用局部变量传递
- 为什么可以通过引用局部变量而不是临时变量来返回函数?c++
- 捕获带有未引用局部变量警告的异常
- c++11时间非引用局部变量