Les routines de désallocation de mémoire touchent-elles le bloc libéré?
-
20-08-2019 - |
Question
Windows HeapFree, msvcrt free: font-ils que la mémoire libérée soit paginée? J'essaie d'estimer que libérer la mémoire à la sortie accélérerait considérablement l'arrêt de l'application.
REMARQUE: Il s'agit d'une question technique très spécifique. Il ne s'agit pas de savoir si les applications doivent ou non appeler free
à la sortie.
La solution 2
J'ai effectué un test pour HeapFree
. Le programme suivant contient une violation d'accès à l'intérieur de free
à i = 31999:
#include <windows.h>
int main() {
HANDLE heap = GetProcessHeap();
void * bufs[64000];
// populate heap
for (unsigned i = 0; i < _countof(bufs); ++i) {
bufs[i] = HeapAlloc(heap, 0, 4000);
}
// protect a block in the "middle"
DWORD dwOldProtect;
VirtualProtect(
bufs[_countof(bufs) / 2], 4000, PAGE_NOACCESS,
&dwOldProtect);
// free blocks
for (unsigned i = 0; i < _countof(bufs); ++i) {
HeapFree(heap, 0, bufs[i]);
}
}
La pile est
ntdll.dll!_RtlpCoalesceFreeBlocks@16() + 0x12b9 bytes
ntdll.dll!_RtlFreeHeap@12() + 0x91f bytes
shutfree.exe!main() Line 19 C++
On dirait donc que la réponse est & "Oui &"; (Ceci s'applique également à <=> puisqu'il utilise <=> en interne)
Autres conseils
Si vous ne désallouez pas proprement toutes vos ressources à l’arrêt de l’application, il sera presque impossible de détecter si vous rencontrez des problèmes très graves, comme des fuites de mémoire, qui poseraient davantage de problèmes que des arrêts lents. Si l’interface disparaît rapidement, l’utilisateur pensera qu’elle s’est fermée rapidement, même s’il a encore beaucoup à faire. Avec l'interface utilisateur, la perception de la vitesse est plus importante que la vitesse réelle. Lorsque l'utilisateur sélectionne l'option "Quitter l'application", la fenêtre principale de l'application doit immédiatement disparaître. Peu importe si l'application prend quelques secondes après cela pour libérer toutes les sorties, l'utilisateur ne le remarquera pas.
Je suis presque sûr que la réponse à la question d'amélioration de la vitesse serait & "oui &"; La libération d'un bloc peut toucher ou non le bloc en question, mais il faudra certainement mettre à jour les autres informations de comptabilité dans tous les cas. Si vous avez des zillions de petits objets alloués (cela arrive), alors l'effort requis pour les libérer tous pourrait avoir un impact significatif.
Si vous pouvez l'arranger, vous pouvez essayer de configurer votre application de telle sorte que, si elle sait qu'elle va se fermer, enregistrez tout travail en attente (configuration, documents, etc.) et quittez-le sans grâce.