![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| kurlyak |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 7.11.2007 Репутация: нет Всего: 3 |
Пишу на WinAPI, VS2005.
Есть у меня три файла- один с функцией WinMain(), другой файл с классом, третий файл с заголовком класса. Порядок вызова такой:
Теперь вобщим о проблеме, а проблема вся в том, что у меня в функции ReadLevelFile() происходит множество вызовов TR2alloc() когда загружается файл уровня игры и выделяется память под нужные структуры. Так вот когда весь уровень из игры загружен (файл уровня 2 мегабайта) в самом конце функции ReadLevelFile() память перестает выделяться и внезапно функция TR2alloc() перестает выделять память. Прямо курьез какой- то - везде в программе память выделялась, а дошел до конца память перестала выделяться bad_alloc типа ошибка. Пробывал использовать оператор new - то же самое. Я не очень разбираюсь, но функция malloc() выделяет память из кучи, у меня 2 Гига оперативки. кроме того есть аналогичная тестовая функция в другом проекте когда весь код класса из функции ReadLevelFile() заключен в WinMain() - то есть весь тот же код но без использования классов- все сделано в одном файле главном проекта. И этот тестовый код работает. А когда начал делать с классами проект, вызывать функцию из функций других пользовательских - то все, память перестает выделяться. Что это может быть? Заранее благодарен. |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
48 - это правильное число? Может, лучше sizeof(struct tr2_room_light_struct) или что-то подобное? Вызовите GetLastError() и напечатайте ошибку ;) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| kurlyak |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 7.11.2007 Репутация: нет Всего: 3 |
Огромное спасибо feodorv!
Как то не додумал примостить GetLastError() в свой код - давно этой функцией не пользовался. Она вернула ошибку. Я по ошибке нашел в интернете как проверить состояние кучи памяти:
И потом нашел что в моей структуре я пользуюсь:
После этого происходил сбой в куче памяти. Я поменял на старую функцию strcpy():
И все заработало. Но теперь следующий вопрос. После того как все заработало у меня предупреждения компилятора что я использую старую функцию strcpy() вместо новой strcpy_s(). Так вот - как мне сделать что бы в данном мое случае использовать char * FileName = {"LEVEL1.PHD"}; и новую функцию strcpy_s() в которой надо указать длинну строки. Когда я указываю длинну строки strcpy_s(Level->FileName, 256, FileName) то опять происходит сбой кучи памяти. Может поменят так:
Так работает код, но у меня вопрос есть ли другие варианты с strcpy_s()? Заранее благодарен за внимание. |
||||||||
|
|||||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Это чисто мелкомягковская затея. Придумали они это, и портят жизнь программерам своими предупреждениями. Отключить такую заботу, можно так: (куда нибудь в главную шапку) #define _CRT_SECURE_NO_WARNINGS К тому-же strcpy_s() ище и непереносима. (во всех смыслах (это все конечно моё имхо.) |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 11 Всего: 45 |
Это хорошо))) Но, может, я чего-то не понимаю, но разве так можно:
Если, конечно, после TR2_Level->FileName есть какой-то хвост, в который можно записать этот самый FileName, то всё в порядке. Но если он там действительно есть, то в достаточно вместо 256 указать размер этого хвоста, и всё должно работать с strcpy_s. Не стоит в strcpy_s задавать абстрактный размер доступного пространства))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| kurlyak |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 7.11.2007 Репутация: нет Всего: 3 |
Понял, спасибо.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |