Sur mon Windows 7, ce simple programme provoque l'utilisation continue de l'application en mémoire, sans limite supérieure. J'ai enlevé tout non-essentiel, et il semble clair que le coupable est la fonction de Microsoft Iphlpapi "GetIpAddrTable()". À chaque appel, il perd de la mémoire. Dans une boucle (par exemple, vérifier les modifications apportées à la liste d'interface réseau), cela n'est pas viable. Il ne semble pas y avoir d'API de notification asynchrone capable de faire ce travail, alors maintenant je suis confronté à devoir isoler cette logique dans un processus séparé et recycler le processus périodiquement - une solution laide.GetIpAddrTable() fuit la mémoire. Comment résoudre cela?
Des idées?
// IphlpLeak.cpp - demonstrates that GetIpAddrTable leaks memory internally: run this and watch
// the memory use of the app climb up continuously with no upper bound.
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib")
void testLeak() {
static unsigned char buf[16384];
DWORD dwSize(sizeof(buf));
if (GetIpAddrTable((PMIB_IPADDRTABLE)buf, &dwSize, false) == ERROR_INSUFFICIENT_BUFFER)
{
assert(0); // we never hit this branch.
return;
}
}
int main(int argc, char* argv[]) {
for (int i = 0; true; i++) {
testLeak();
printf("i=%d\n",i);
Sleep(1000);
}
return 0;
}
Merci - oui, le code cesse de fuir si j'arrête d'appeler GetIpAddrTable. L'idée de vérifier un code de retour alternatif est bonne, mais le code de production fait cela - la fuite persiste. Pour ce qui est de la notification à Microsoft ... eh bien, je suppose que j'ai une obligation communautaire à le faire, mais pour ce qui est de résoudre mon problème afin que je puisse expédier le produit, ce n'est pas vraiment pratique. Je pense à changer complètement de vitesse - appelez gethostname(), puis gethostbyname() pour récupérer la liste des adresses IP liées à ce nom. Cela devrait suffire, bien qu'il laisse ce mystère irritant. – Stabledog