Havia muita memória, mas provavelmente fragmentada para que você não conseguisse um pedaço contínuo de 16mb. Drop_caches terá acionado uma desfragmentação de memória para que depois haja memória contínua suficiente disponível para honrar sua requisição malloc.
(Esta questão é provavelmente mais adequada para um dos fóruns de programação.)