функция malloc возвращает NULL ... но только 10 первых раз - PullRequest
0 голосов
/ 13 марта 2012

Я портирую игру, встроенную в c, для использования opengl по причинам переноса. Все шло хорошо, пока по некоторым причинам функции malloc в игре перестали работать.

Я искал ответ на этот вопрос. Единственное, что я обнаружил, это то, что malloc возвращает NULL. Очень простой malloc, который создает простую структуру из нескольких байтов.

Я сделал несколько попыток и написал команду внутри цикла. И мое удивление состояло в том, что это провалилось первые 10 раз, но после этого команда сработала и игра началась. Структура была создана несколько раз после этого без проблем.

Я бы сказал, чтобы оставить все как есть, но я уверен, что что-то не так, и в других системах может работать неправильно. Вот почему я хочу спросить, какая у меня проблема, почему и как ее избежать. Среда не очень дружелюбная, и мне не хватает средств отладки, поэтому я был бы признателен за максимально возможное количество деталей.

спасибо.

EDIT: Код прост.

ObjectBase* newcoin;
newcoin= (ObjectBase*)calloc(1,sizeof(ObjectBase));

в то время как структура ObjectBase очень мала. Не более 200 байт.

Аппаратное обеспечение - компьютер под управлением Windows 7 с 4 ГБ или памятью. Даже при этом ошибка:

Visual C++ CRT: Not enough memory to complete call to strerror

Раньше все работало нормально. Больше проблем. У меня такая же проблема при загрузке файлов с диска. Это происходит от 10 до 15 раз, а затем работает правильно. Проблема случается всегда. Каждый раз, когда я перезапускаю приложение, оно вылетает.

1 Ответ

0 голосов
/ 13 марта 2012

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

Если вы проверили, что в вашей программе нет утечек или неправильного поведения w.r.t. malloc, может случиться так, что malloc вернет NULL, поскольку память недоступна.

Может даже случиться, что malloc вернет NULL, тогда какая-нибудь сторонняя библиотека освободит часть памяти с free, тогда malloc может снова дать вам немного свежей памяти.

Вы могли бы также рассмотреть возможность использования консервативного сборщика мусора Бема , который использует GC_malloc вместо malloc и не слишком беспокоится об освобождении памяти.

Если в Linux используется псевдо-файловая система / proc , чтобы узнать о вашем процессе (например, /proc/1234/maps для процесса pid 1234, также /proc/self/maps изнутри процесса и /proc/self/statm так далее). Смотрите также команду pmap.

...