SDL2 C++ - SDL_FreeSurface 不从 RAM 中删除图像
SDL2 C++ - SDL_FreeSurface does not remove the image from RAM
我遇到内存泄漏问题。
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;
它们也不起作用。
因为这是内存分配器的工作方式。
从代码中释放或删除内存并不一定意味着您的用户 space 内存分配器将有资格 return 将内存分配给 OS。原因是它可以有一些优化策略。想象一下,您连续 malloc(3) 100 MB 内存并 free(3) 它。 returning 和从 OS 取回内存的开销将是巨大的。而是 userspace 内存分配器对分配的内存块的生命周期进行了一些优化。因此,您无需将每个 malloc(3)、new、free(3) 或 delete 都视为函数调用,这将导致进程的 RSS 发生变化。将其视为对从 OS 获得的内存的智能抽象。
如果你真的想检查你的程序是否存在内存泄漏——考虑使用特定的工具——例如valgrind.
此外,此代码:
free(surface);
delete surface;
肯定是错的。您必须为与分配器对应的内存块使用释放器,您曾用于分配内存。 malloc/free、new/delete。两者或不匹配对是一个错误。
我遇到内存泄漏问题。 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;
它们也不起作用。
因为这是内存分配器的工作方式。 从代码中释放或删除内存并不一定意味着您的用户 space 内存分配器将有资格 return 将内存分配给 OS。原因是它可以有一些优化策略。想象一下,您连续 malloc(3) 100 MB 内存并 free(3) 它。 returning 和从 OS 取回内存的开销将是巨大的。而是 userspace 内存分配器对分配的内存块的生命周期进行了一些优化。因此,您无需将每个 malloc(3)、new、free(3) 或 delete 都视为函数调用,这将导致进程的 RSS 发生变化。将其视为对从 OS 获得的内存的智能抽象。 如果你真的想检查你的程序是否存在内存泄漏——考虑使用特定的工具——例如valgrind.
此外,此代码:
free(surface);
delete surface;
肯定是错的。您必须为与分配器对应的内存块使用释放器,您曾用于分配内存。 malloc/free、new/delete。两者或不匹配对是一个错误。