nedmalloc: откуда берется mem> = fm? - PullRequest
2 голосов
/ 25 марта 2010

При реализации nedmalloc в моем приложении я часто сталкиваюсь с ситуацией, когда nedmalloc отказывается освобождать блок памяти, утверждая, что он не выделил его.

Я использую версию v1.06beta1_svn1151.

Во время отладки я дошел до того, что вижу конкретное условие, которое не выполняется, все остальные (включая магические числа) выполняются успешно. Условие таково:

if((size_t)mem-(size_t)fm>=(size_t)1<<(SIZE_T_BITSIZE-1)) return 0;

На Win32 это похоже на:

if((int)((size_t)mem-(size_t)fm)<0) return 0;

Что похоже на

if((size_t)mem<(size_t)fm) return 0;

В моем случае я действительно вижу mem

Если кто-то здесь понимает внутреннюю работу nedmalloc, не могли бы вы объяснить мне, почему fm <= mem гарантировано? </p>

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Теперь я вижу, что для этой строки был добавлен комментарий / * Проверьте, не меньше ли в памяти mem, чем mem * / и было ли отключено с помощью #if 0 в бета-версии svn1159. Условие не является зрелым и, вероятно, оно неправильное (оно все еще остается в специфичной для Linux части кода - скорее всего, там тоже неправильно?)

Извлеченный урок: « бета выбор может быть нарушен».

1 голос
/ 25 марта 2010

Я предполагаю, что SIZE_T_BITSIZE - это число бит в типе size_t, поэтому сдвиг 1 на SIZE_T_BITSIZE - 1 даст вам (SIZE_MAX + 1) / 2 (математическое) значение. Таким образом, условие проверяет, является ли (size_t)mem - (size_t)fm больше или равно математическому значению (SIZE_MAX + 1) / 2.

Это не то же самое, что (int)((size_t)mem - (size_t)fm) < 0. Кроме того, если mem и / или fm приводятся к size_t, который является типом без знака, арифметика происходит в типах без знака, что означает, что разница не может быть меньше 0. Таким образом, даже если (size_t)mem меньше (size_t)fm, (size_t)mem - (size_t)fm никогда не будет меньше 0. Это равно разнице mem - fm плюс SIZE_MAX плюс 1, что является положительным значением. Преобразование этого значения в int может привести к переполнению, которое определяется реализацией, или может не переполниться, и в этом случае вы получите положительное значение.

Итак, чтобы ответить на ваш вопрос, если (size_t)mem меньше (size_t)fm, у вас, вероятно, ошибка до этой точки.

Что такое m? Под m вы имеете в виду mem?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...