| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > malloc() ошибка выделения памяти |
| Автор: kurlyak 26.2.2012, 18:02 | ||
| Пишу на WinAPI, VS2005. Есть у меня три файла- один с функцией WinMain(), другой файл с классом, третий файл с заголовком класса. Порядок вызова такой:
Теперь вобщим о проблеме, а проблема вся в том, что у меня в функции ReadLevelFile() происходит множество вызовов TR2alloc() когда загружается файл уровня игры и выделяется память под нужные структуры. Так вот когда весь уровень из игры загружен (файл уровня 2 мегабайта) в самом конце функции ReadLevelFile() память перестает выделяться и внезапно функция TR2alloc() перестает выделять память. Прямо курьез какой- то - везде в программе память выделялась, а дошел до конца память перестала выделяться bad_alloc типа ошибка. Пробывал использовать оператор new - то же самое. Я не очень разбираюсь, но функция malloc() выделяет память из кучи, у меня 2 Гига оперативки. кроме того есть аналогичная тестовая функция в другом проекте когда весь код класса из функции ReadLevelFile() заключен в WinMain() - то есть весь тот же код но без использования классов- все сделано в одном файле главном проекта. И этот тестовый код работает. А когда начал делать с классами проект, вызывать функцию из функций других пользовательских - то все, память перестает выделяться. Что это может быть? Заранее благодарен. |
| Автор: feodorv 26.2.2012, 18:22 |
48 - это правильное число? Может, лучше sizeof(struct tr2_room_light_struct) или что-то подобное? Вызовите GetLastError() и напечатайте ошибку ;) |
| Автор: kurlyak 26.2.2012, 19:27 | ||||||||
| Огромное спасибо feodorv! Как то не додумал примостить GetLastError() в свой код - давно этой функцией не пользовался. Она вернула ошибку. Я по ошибке нашел в интернете как проверить состояние кучи памяти:
И потом нашел что в моей структуре я пользуюсь:
После этого происходил сбой в куче памяти. Я поменял на старую функцию strcpy():
И все заработало. Но теперь следующий вопрос. После того как все заработало у меня предупреждения компилятора что я использую старую функцию strcpy() вместо новой strcpy_s(). Так вот - как мне сделать что бы в данном мое случае использовать char * FileName = {"LEVEL1.PHD"}; и новую функцию strcpy_s() в которой надо указать длинну строки. Когда я указываю длинну строки strcpy_s(Level->FileName, 256, FileName) то опять происходит сбой кучи памяти. Может поменят так:
Так работает код, но у меня вопрос есть ли другие варианты с strcpy_s()? Заранее благодарен за внимание. |
| Автор: feodorv 26.2.2012, 21:56 | ||
Это хорошо))) Но, может, я чего-то не понимаю, но разве так можно:
Если, конечно, после TR2_Level->FileName есть какой-то хвост, в который можно записать этот самый FileName, то всё в порядке. Но если он там действительно есть, то в достаточно вместо 256 указать размер этого хвоста, и всё должно работать с strcpy_s. Не стоит в strcpy_s задавать абстрактный размер доступного пространства))) |
| Автор: kurlyak 28.2.2012, 16:05 |
| Понял, спасибо. |