Penso che la liberazione diretta sia la migliore. Il comportamento indefinito è la cosa peggiore, quindi se hai accesso mentre è ancora definito nel tuo processo, fallo, ci sono molte buone ragioni che le persone hanno dato per questo.
Per quanto riguarda dove, o se, l'ho trovato in W98, la vera domanda era "quando" (non ho visto un post che enfatizza questo). Un piccolo programma modello (per l'input MIDI SysEx, utilizzando vari spazi mallocati) libererebbe memoria nel bit WM_DESTROY di WndProc, ma quando l'ho trapiantato in un programma più grande si è bloccato all'uscita. Ho pensato che questo significasse che stavo cercando di liberare ciò che il sistema operativo aveva già liberato durante una pulizia più ampia. Se l'ho fatto su WM_CLOSE, quindi chiamato DestroyWindow (), ha funzionato tutto bene, uscita pulita istantanea.
Anche se questo non è esattamente lo stesso dei buffer MIDI, c'è una somiglianza in quanto è meglio mantenere intatto il processo, ripulire completamente, quindi uscire. Con modesti blocchi di memoria questo è molto veloce. Ho scoperto che molti piccoli buffer funzionavano più velocemente durante il funzionamento e la pulizia rispetto a pochi buffer grandi.
Possono esistere delle eccezioni, come qualcuno ha detto quando si evita di estrarre grossi blocchi di memoria da un file di scambio su disco, ma anche questo può essere ridotto al minimo mantenendo più e più piccoli spazi allocati.