Pode ser possível que seu programa tenha usado memória compartilhada e não tenha limpado isso.
Existem três variantes de memória compartilhada no linux:
1.) A memória compartilhada POSIX (aquela implementada pela glibc) é acessível por meio de arquivos no pseudo-sistema de arquivos tmpfs e geralmente é montada pelo sistema em locais como /dev/shm , /run , /run/shm ou %código%. A melhor maneira de descobrir com certeza é inserir /run/lock (mais portátil) ou mount | grep -E '^tmpfs' (melhor para o Linux) em um shell.
Observe que é possível para um processo chamar grep -E '^tmpfs' /proc/mounts em um arquivo unlink() 'ed na memória compartilhada, tornando o arquivo inacessível por meio do nome do arquivo (por exemplo, é necessário um identificador de arquivo previamente alocado para continuar acessando-o). No entanto, mmap() ed arquivos são geralmente excluídos ao sair de todos os processos que tinham unlink() 'ed - talvez se o seu programa terminar, ainda há outro processo ainda segurando um identificador para ele.
2.) Memória compartilhada SysV IPC, que não é visível através do pseudo-sistema de arquivos open() , mas via tmpfs , syscalls do Linux (somente se você for um hacker), seu wrapper libc ou, mais recentemente via /proc/sysvipc/shm . Você precisa encontrar um ID de processo correspondente em qualquer uma dessas listas e, em seguida, inspecionar esse processo ainda mais.
3.) Memória compartilhada mapeada anônima, em cujo caso a memória não é suportada por nenhum arquivo, mas sim a memória é inicialmente compartilhada entre um processo e todos os seus filhos. AFAIK essa memória compartilhada mapeada anônima é liberada quando o processo que ipcs -m -p -[tclu] 'ed it mmap() s. Então, caso o seu programa tenha terminado e todos os seus processos filhos também tenham funcionado, eles não devem mais ocupar a memória.