bad_alloc подробно? - PullRequest
       7

bad_alloc подробно?

0 голосов
/ 31 января 2010

Я работаю над игровым проектом. В последнее время мы сталкиваемся с проблемой, которая вызывает тривиальное исключение «bad_alloc», когда мы загружаем / выгружаем разные сцены примерно три раза.

Каждый раз, когда мы загружаем сцену, мы сначала загружаем сжатую папку .zip в память, а затем извлекаем из нее игровые объекты. Поскольку у нас нет инструмента профилирования памяти, я просто использую график производительности Process Explorer, чтобы увидеть, что происходит:

  1. Запустите игру ==> ~ 620 МБ
  2. Загрузить первую сцену ==> ~ 1,1 ГБ
  3. Выгрузите его ==> ~ 620 МБ
  4. Загрузить 2-ую сцену ==> ~ 1,1 ГБ
  5. Выгрузите его ==> ~ 620 МБ
  6. Загрузить 3-ю сцену ==> bad_alloc

Я прослеживаю до нового оператора каждой загрузки. Загрузка сжатой папки стоит 100 ~ 120 МБ самой памяти, и bad_alloc выбрасывается из нее при 3-й загрузке.

На нашей платформе установлена ​​физическая память объемом 2 ГБ. Похоже, мы ничего не оставили после разгрузки сцены. Каждая сжатая папка имеет примерно одинаковый размер. Однако новый оператор 3-й загрузки просто не работает.

Мне интересно, каков возможный смысл этого bad_alloc? Недостаточно памяти? или просто не можете выделить непрерывный блок требуемого размера? Если у него есть несколько возможностей, как я могу это определить?

Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

7 голосов
/ 31 января 2010

Если вы выделяете всю эту память за раз (только одну new), возможно, куча слишком фрагментирована, чтобы найти достаточно непрерывной памяти для выделения того, что вы запрашивали.

Это можно решить, распределив новую сцену по частям.

2 голосов
/ 31 января 2010

bad_alloc выбрасывается new, когда распределение не может быть выполнено. Скорее всего, вам просто не хватает памяти. Как правило, пользовательские менеджеры памяти также выдают bad_alloc, когда их запрос не может быть выполнен, но вы сказали, что не используете их. Запустите ваш код в отладчике, чтобы увидеть, откуда возникло исключение.

Кстати, это много памяти. Большинство профессиональных игр требуют от половины до четверти того, что вы делаете; изучить способы уменьшения использования памяти. Еще одна вещь, на которую следует обратить внимание, это утечки памяти; если вы никогда не освободите память, у вас все закончится.

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