Windows — деление на ноль вызывает утечку памяти в Borland Stack Overck

Я просто запускаю следующий код в Borland C ++ Builder Version 6;

for (int i = 0; i < 40000; i++)
{
try {
__int64 n = 0;
__int64 r = 1 / n;
}
catch (Exception& e) {}
}

и во время выполнения этого цикла я вижу в диспетчере задач (столбец Память), что это утечка памяти. Есть идеи почему?

У меня была утечка памяти во время работы над вычислительным модулем в моем проекте, когда я пытался разделить на ноль, и после многочасового удара по голове, где утечка памяти, я понял, что это утечка памяти и в вышеупомянутом простом цикле. В проекте не было найдено никаких проблем.

5

Решение

Из стандарта 5/4 мы узнаем, что:

Если во время вычисления выражения результат не
математически определены или нет в диапазоне представимых значений для
его тип, поведение не определено.

Таким образом, поскольку деление на ноль математически не определено, поведение не определено. Неопределенное поведение включает в себя утечки памяти, поэтому не стоит спекулировать Зачем это утечка памяти (хотя такой инструмент, как valgrind, может помочь вам определить источник).

4

Другие решения

Диспетчер задач не очень хороший инструмент для тестирования утечек памяти. Он может только сообщить, сколько памяти было выделено процессом, но не то, как этот процесс использует память.

То, что вы не принимаете во внимание, это то, что менеджер памяти C ++ Builder кэширует освобожденную память, он не сразу возвращает ее в ОС. То, что вы, вероятно, видите фрагментация памяти, не утечка памяти. Фрагментация может помешать менеджеру памяти повторно использовать уже кэшированную память, что заставляет его выделять все больше и больше памяти ОС. Это может вызвать поведение, которое вы видите в диспетчере задач. Если вы смотрите диспетчер задач Page Faults столбец, вы увидите, что это значение растет вместе с использованием памяти. Это хороший признак того, что память не используется повторно.

При этом менеджер памяти по умолчанию, используемый C ++ Builder 6, был не самым лучшим менеджером памяти. Это было заменено в более поздней версии FastMM, который также можно использовать в C ++ Builder 6. FastMM не страдает от фрагментации памяти.

2