j'ai un morceau de code C++ qui libère la mémoire comme suitMontant de l'augmentation de la mémoire physique que je libérer des blocs
for (int i = Pages-1; i >= NewPages; i--)
{
LPVOID p = m_Pages[i];
free(p);
}
Alors que le code fonctionne bien, lorsqu'il est appelé à partir d'un gestionnaire d'exception, il fonctionne très lentement. En regardant le gestionnaire de tâches tout en faisant un pas à travers la boucle ci-dessus, la quantité de mémoire physique utilisée par le processus (Mem Usage) augmente avec chaque appel à libérer, tandis que la mémoire virtuelle (VM Size) reste la même. Finalement, le processus se termine anormalement.
Le code qui alloue la mémoire qui lève l'exception est le suivant;
for (int i = Pages; i < NewPages; i++)
{
LPVOID p = malloc(m_ElementsPerPage*m_ElementSize);
if (!p)
AfxThrowMemoryException();
m_Pages.Add(p);
}
maintenant un coup d'oeil, je crois que si j'inverse l'ordre de la boucle de désaffectation, de telle sorte que le dernier bloc alloué est le premier libéré, je pourrais éviter ce problème. Mais existe-t-il une raison pour laquelle l'utilisation de la mémoire de processus devrait augmenter avec un appel à libérer, et pourquoi l'appel libre sur un bloc de mémoire de tas valide devrait provoquer la fin du programme? (n.b. la terminaison pourrait bien être liée au débogueur plutôt qu'à l'application elle-même).
Edit: Le système d'exploitation est Windows XP SP3, le compilateur est MSVC++ 8
Edit2: Une version plus complète du code est la suivante;
void MyArray::ResizeArray(int NewPages)
{
int Pages = m_Pages.GetSize();
if (NewPages != Pages)
{
if (NewPages > Pages) // Grow the page array
{
for (int i = Pages; i < NewPages; i++)
{
LPVOID p = malloc(m_ElementsPerPage*m_ElementSize);
if (!p)
AfxThrowMemoryException();
m_Pages.Add(p);
}
} else // Shrink the page array
{
for (int i = Pages-1; i >= NewPages; i--)
{
LPVOID p = m_Pages[i];
free(p);
}
m_Pages.SetSize(NewPages);
}
}
}
Le tas est corrompu. Mettez à jour votre système d'exploitation, vous obtiendrez un diagnostic précoce au lieu de simplement labourer dans l'abîme. –
semble que le problème existe ailleurs. – wheaties
Il me semble que la mémoire allouée a été échangée sur le disque, et l'appel à libérer ramène réellement les pages de mémoire en RAM, ce qui pourrait expliquer la lenteur et l'utilisation de la mémoire physique accrue. – SirDarius