У меня есть фрагмент кода C ++, который освобождает память следующим образом
for (int i = Pages-1; i >= NewPages; i--)
{
LPVOID p = m_Pages[i];
free(p);
}
Хотя код работает нормально, при вызове из обработчика исключений он работает очень медленно. Если посмотреть на диспетчер задач при пошаговом выполнении вышеуказанного цикла, объем физической памяти, используемой процессом (использование памяти), увеличивается с каждым вызовом освобождения, тогда как виртуальная память (размер виртуальной машины) остается неизменной. В конце концов процесс завершается ненормально.
Код, выделяющий память, которая выдает исключение, выглядит следующим образом:
for (int i = Pages; i < NewPages; i++)
{
LPVOID p = malloc(m_ElementsPerPage*m_ElementSize);
if (!p)
AfxThrowMemoryException( );
m_Pages.Add(p);
}
Теперь с первого взгляда я подозреваю, что если я переверну порядок цикла освобождения, чтобы последний выделенный блок был первым освобожденным, я мог бы избежать этой проблемы. Но есть ли какая-то причина, по которой использование памяти процесса должно увеличиваться при вызове free, и почему вызов free для допустимого блока памяти кучи должен привести к завершению программы? (нет, окончание вполне может быть связано с отладчиком, а не с самим приложением).
Редактировать: Операционная система - Windows XP SP3, компилятор - MSVC ++ 8
Edit2: Более полная версия кода выглядит следующим образом:
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);
}
}
}