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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
EliteOne
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 8
#1

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

02.07.2015, 16:11. Просмотров 292. Ответов 4
Метки нет (Все метки)

Пишу код, "для себя", так скажем. пытаюсь практиковаться. Балуюсь, другими словами.

В релизе то, что я написал, отрабатывает, в дебаге ошибка выхода за пределы памяти. Все бы ничего, но я не понимаю, почему именно в этом месте. В классе есть массив указателей. Есть метод, который, получив указатель на необходимый объект, в цикле, поочередно проверяет наличие адреса в ячейке массива, если адреса нет, то записывает адрес объекта из аргумента и выходит из цикла по брейку. и есть метод, который выводит на экран текст из объектов, на которые указывает массив или, если очередная ячейка не указывает (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++):

Разные значения в дебаге и релизе - C++
В общем в чем суть, пишу игру, участок сетевого кода написан с помощью sfml. В дебаге программа не работает, потому что изходящие и...

Ошибка выхода за пределы границ вектора - C++
как исправить ошибку?

Программа при релизе не работает, а при дебаге работает - C++
#include&lt;iostream&gt;; #include &lt;iomanip&gt; #include&lt;fstream&gt; using namespace std; void printMatrix (int **a, int n, int m) // функція...

Динамические массивы. Последствия выхода за пределы - C++
int main(int argc, char* argv) { int x1=0,x2=0; int num=3; int* p1=new int ; int* p2=new int ; p1=0; p1=1; p1=2; p1=3;

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы - C++
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы. Безопасный вектор определяет переменные нижний и верхний...

Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы - C++
Помогите не знаю как сделать! Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы. Безопасный...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
rikimaru2013
C++ Game Dev
2427 / 1121 / 240
Регистрация: 30.11.2013
Сообщений: 3,672
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
2427 / 1121 / 240
Регистрация: 30.11.2013
Сообщений: 3,672
02.07.2015, 18:32 #4
Цитата Сообщение от EliteOne Посмотреть сообщение
не знаю, как объяснить. мне главное понять,
я не смотрел весь код. Я запустил код, вылезла ошибка, открываю в Visual Studio окно "Стек вызова" и смотрю с какого в какой метод пригала программа. И вижу, что она начала лететь после той строки, перезапускаю прогу с брейкпоинтом в той строке. Смотрю в дебагере массив этот и он пустой, тобишь не заполнен и не занулён. Как-то так.
EliteOne
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 8
03.07.2015, 14:03  [ТС] #5
в общем проблема решилась явным занулением массива в конструкторе по умолчанию.
такое чувство, что для указателей, созданных в объектах динамической памяти, состояние по умолчанию не определено
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 14:03
Привет! Вот еще темы с ответами:

Отлов выхода строки за рамки памяти - C++
Здравствуйте, есть программа, в которой иногда возникает ошибка если строка очень большая мне надо получить эту строку, пытаюсь сделать с...

Выход за пределы памяти - C++
подскажите почему вылазит за пределы памяти присвоение в 25 строке как сделать чтобы работало#include &lt;iostream&gt; #include &lt;cstring&gt; ...

Выйти указателем за пределы памяти программы - C++
Создаю я переменные int x = 0; int* xpp; затем ну можно по нажатию можно циклом буду выводить адрес ... xpp = &amp;x + i; ...

Выход за пределы выделенной памяти (new, malloc) - C++
День был пасмурный... Чашка чая помогала не заснуть перед монитором... На экране высвечивались два файла с разными расширениями: .c и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.07.2015, 14:03
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru