SDL2 C ++ - SDL_FreeSurface不会从RAM中删除图像

时间:2015-06-05 14:50:52

标签: c++ memory-leaks

我遇到内存泄漏问题。 在SDL_FreeSurface函数之后,我的应用程序中的RAM使用量不会减少。

代码:

//10 000 KB RAM
SDL_Surface * surface = SDL_CreateRGBSurface(NULL,32000,5400,1,0,0,0,0);
//700 000 KB RAM
SDL_FreeSurface(surface);
//700 000 KB RAM

为什么RAM使用不会减少?

free(surface);
delete surface;
surface->pixels=NULL;

它们也不起作用。

1 个答案:

答案 0 :(得分:2)

因为它是内存分配器工作的一种方式。 从代码中释放或删除内存并不一定意味着您的用户空间内存分配器将有资格将已分配的内存返回给操作系统。原因是它可以有一些优化策略。想象一下,你连续malloc(3)100 MB的内存和免费(3)它。从OS返回和恢复内存的开销将是巨大的。而是用户空间内存分配器对分配的内存块的生命周期进行一些优化。因此,您不需要考虑每个malloc(3),new,free(3)或删除函数调用,这将导致您的进程的RSS更改。将其视为对从OS获得的内存的智能抽象。 如果你真的想检查程序是否存在内存泄漏 - 请考虑使用特定工具 - 例如的valgrind。

此外,此代码:

free(surface);
delete surface;

绝对是错的。您必须使用deallocator作为与分配器相对应的内存块,用于分配内存。 malloc / free,new / delete。两个或非匹配对都是错误。