через некоторое время realloc возвращает NULL, выделяя небольшой (<500Kb) блок данных; есть достаточно памяти - PullRequest
0 голосов
/ 26 апреля 2010

Привет!

Короткий вопрос: в чем может быть проблема?

Общее использование памяти моей программой (показанной диспетчером задач) практически одинаково все время (около 40 минут), когда она работает, и у меня почти на 2 ГБ больше свободной памяти.

Работает на win2003r2.

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

Обычно есть только 2 причины, по которым realloc не сможет работать

  1. Недостаточно непрерывной памяти для удовлетворения запроса
  2. Повреждение памяти

Даже если в вашей программе достаточно общей памяти, чтобы удовлетворить запрос, может быть недостаточно непрерывной памяти для этого из-за фрагментации. Лучший способ определить это - использовать инструмент, который может сообщать о смежных блоках, чтобы определить, доступен ли он для удовлетворения вашего запроса. Я считаю, что один из инструментов в пакете sysinternals делает это.

1 голос
/ 26 апреля 2010

Без кода, все, что я могу вам дать, это обходной путь.

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

Сделайте своей целью уменьшить фрагментацию любой ценой, поддерживая рабочий набор в 200 МБ, как мне кажется, идеально для сегодняшней вычислительной мощности. Если вы часто превышаете 500 МБ и ваша программа запускается в течение длительного периода времени, вы можете продолжить изучение оптимизации рабочего набора, но до тех пор не беспокойтесь об этом.

...