Creo que la liberación directa es lo mejor. El comportamiento indefinido es lo peor, por lo que si tiene acceso mientras aún está definido en su proceso, hágalo, hay muchas buenas razones que la gente ha dado para ello.
En cuanto a dónde, o si, encontré eso en W98, la verdadera pregunta era 'cuándo' (no vi una publicación que enfatice esto). Un pequeño programa de plantilla (para entrada MIDI SysEx, usando varios espacios malloc'd) liberaría memoria en el bit WM_DESTROY del WndProc, pero cuando trasplante esto a un programa más grande, se bloqueó al salir. Supuse que esto significaba que estaba tratando de liberar lo que el sistema operativo ya había liberado durante una limpieza más grande. Si lo hice en WM_CLOSE, luego llamé a DestroyWindow (), todo funcionó bien, salida limpia instantánea.
Si bien esto no es exactamente lo mismo que los búferes MIDI, hay una similitud en que es mejor mantener el proceso intacto, limpiar completamente y luego salir. Con trozos de memoria modestos, esto es muy rápido. Descubrí que muchos búferes pequeños funcionaban más rápido en operación y limpieza que pocos grandes.
Pueden existir excepciones, como dijo alguien al evitar extraer grandes trozos de memoria de un archivo de intercambio en el disco, pero incluso eso puede minimizarse manteniendo más espacios asignados y más pequeños.