mirror of https://github.com/OpenTTD/OpenTTD
(svn r8101) -Fix (runknown): Plug potential memleaks when calling UnInitWindowSystem. The function directly deleted all windows instead of calling their respective deallocators which could then in turn any used memory.
parent
64c30ae737
commit
e832a1d046
|
@ -902,14 +902,19 @@ void InitWindowSystem(void)
|
||||||
void UnInitWindowSystem(void)
|
void UnInitWindowSystem(void)
|
||||||
{
|
{
|
||||||
Window **wz;
|
Window **wz;
|
||||||
/* Delete all malloced widgets, and reset z-array */
|
|
||||||
|
restart_search:
|
||||||
|
/* Delete all windows, reset z-array.
|
||||||
|
*When we find the window to delete, we need to restart the search
|
||||||
|
* as deleting this window could cascade in deleting (many) others
|
||||||
|
* anywhere in the z-array. We call DeleteWindow() so that it can properly
|
||||||
|
* release own alloc'd memory, which otherwise could result in memleaks */
|
||||||
FOR_ALL_WINDOWS(wz) {
|
FOR_ALL_WINDOWS(wz) {
|
||||||
free((*wz)->widget);
|
DeleteWindow(*wz);
|
||||||
(*wz)->widget = NULL;
|
goto restart_search;
|
||||||
(*wz)->widget_count = 0;
|
|
||||||
*wz = NULL;
|
|
||||||
}
|
}
|
||||||
_last_z_window = _z_windows;
|
|
||||||
|
assert(_last_z_window == _z_windows);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetWindowSystem(void)
|
void ResetWindowSystem(void)
|
||||||
|
|
Loading…
Reference in New Issue