Форум программистов, компьютерный форум CyberForum.ru

Ошибка выхода за пределы памяти в дебаге, в релизе ОК - C++

Восстановить пароль Регистрация
 
EliteOne
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 8
02.07.2015, 16:11     Ошибка выхода за пределы памяти в дебаге, в релизе ОК #1
Пишу код, "для себя", так скажем. пытаюсь практиковаться. Балуюсь, другими словами.

В релизе то, что я написал, отрабатывает, в дебаге ошибка выхода за пределы памяти. Все бы ничего, но я не понимаю, почему именно в этом месте. В классе есть массив указателей. Есть метод, который, получив указатель на необходимый объект, в цикле, поочередно проверяет наличие адреса в ячейке массива, если адреса нет, то записывает адрес объекта из аргумента и выходит из цикла по брейку. и есть метод, который выводит на экран текст из объектов, на которые указывает массив или, если очередная ячейка не указывает (NULL), пишет Empty.
при отладке вываливается с ошибкой выхода за пределы памяти в месте вывода этого текста.(Необработанное исключение по адресу 0x00275BB1 в d2Calc.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCDCD.)

в видимых ресурсах пишет "inventory 0x00388c08 {0xcdcdcdcd {itemname=0xcdcdcdcd <Ошибка при чтении символов строки.> manargnmultiplex=??? ...}, ...} item *[6]" (inventory[] - это тот самый массив указателей)

При этом в релизе отрабатывает, как надо.

Кода я написал уже достаточно, поэтому выложил архив проекта.

Сразу оговорюсь, мой уровень низкий, поэтому код возможно будет резать глаза.
Вложения
Тип файла: zip d2Calc.zip (3.63 Мб, 6 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2015, 16:11     Ошибка выхода за пределы памяти в дебаге, в релизе ОК
Посмотрите здесь:

C++ Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы C++
Отлов выхода строки за рамки памяти C++
C++ Программа при релизе не работает, а при дебаге работает
C++ Выход за пределы массива при очистке памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
02.07.2015, 17:32     Ошибка выхода за пределы памяти в дебаге, в релизе ОК #2
C++
1
item* inventory[6];
C++
1
cout<<setw(20)<<left<<inventory[j++]->itemname;   // hero.cpp 288 line
В данный моммент массив переменных типа Item* не заполнен. Тоесть нигде в коде нету

C++
1
2
3
4
5
6
for(int i=0; i < size; i++)
inventory[i] = new Item();
 
 
 
inventory[0]->setItem("SashaAndYasha");



P.S.
C++
1
2
hero(const char*,double,double,double,double,double,double,double,double,double,double,double,double,main_stat,attack_type);
    void setstathero(const char*,double,double,double,double,double,double,double,double,double,double,double,double,main_stat,attack_type);
Избегайте этого плиз
EliteOne
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 8
02.07.2015, 18:29  [ТС]     Ошибка выхода за пределы памяти в дебаге, в релизе ОК #3
рикимару

если честно, я не понял.

1. в коде я вызывал printinventory и после того, как в нем уже были два указателя на item, т.е. частично он заполнен.
или "не заполнен" имеется ввиду другое?
2. до того, как я создал в динамической памяти объекты hero, я создавал на стеке, для теста одиночные объекты класса hero, там все работало в обоих режимах (debug/release).
3. почему тогда в релизе визуально отрабатывает корректно?
4. вы предлагаете дополнить item методами?

Не знаю, как объяснить. Мне главное понять, что не так, если честно. Не как сделать, что бы работало, а почему не работает. Я так понимаю, я неправильно использую указатели.


Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Избегайте этого плиз
сам понимаю, что получается очень неудобно и некрасиво, но как сделать лучше - не придумал.

спасибо за ответ энивей
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
02.07.2015, 18:32     Ошибка выхода за пределы памяти в дебаге, в релизе ОК #4
Цитата Сообщение от EliteOne Посмотреть сообщение
не знаю, как объяснить. мне главное понять,
я не смотрел весь код. Я запустил код, вылезла ошибка, открываю в Visual Studio окно "Стек вызова" и смотрю с какого в какой метод пригала программа. И вижу, что она начала лететь после той строки, перезапускаю прогу с брейкпоинтом в той строке. Смотрю в дебагере массив этот и он пустой, тобишь не заполнен и не занулён. Как-то так.
EliteOne
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 8
03.07.2015, 14:03  [ТС]     Ошибка выхода за пределы памяти в дебаге, в релизе ОК #5
в общем проблема решилась явным занулением массива в конструкторе по умолчанию.
такое чувство, что для указателей, созданных в объектах динамической памяти, состояние по умолчанию не определено
Yandex
Объявления
03.07.2015, 14:03     Ошибка выхода за пределы памяти в дебаге, в релизе ОК
Ответ Создать тему
Опции темы

Текущее время: 18:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru