Вопрос № 25213: Добрый день уважаемые эксперты. Изучаю язык С++ и столкнулся с проблемой. Написал кусочек кода и никак не могу понять почему вылезает ошибка. В программе используется оператор new для того, чтобы создать динамический массив из необходимого числа стру...
Вопрос № 25.213
Добрый день уважаемые эксперты. Изучаю язык С++ и столкнулся с проблемой. Написал кусочек кода и никак не могу понять почему вылезает ошибка. В программе используется оператор new для того, чтобы создать динамический массив из необходимого числа структур, а перед выходом из программы используется оператор delete, но при прогоне программа в среде MS Visual C++ 6.0 выводит модальное окно в котором предлагается или завершить программу или попасть в отладчик... Компилятор Borland C++ 5 сразу отправляет в отладчик.
Помогите найти ошибку.
Приложение:
Отправлен: 23.08.2005, 16:25
Вопрос задал: Filth (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: BOIL
Здравствуйте, Filth!
Рекомендую отказаться от выделения оператором new памяти для глобальной переменной подобным способом
делайте это в теле main()
тогда и delete пройдет без замечаний
Удачи!...
Ответ отправил: BOIL (статус: 3-ий класс)
Отправлен: 23.08.2005, 16:39 Оценка за ответ: 5 Комментарий оценки: Спасибо!!! Теперь всё как надо!
Отвечает: yatagan
Здравствуйте, Filth!
ну вот например здесь:
"
int ArSize; // количество структур в массиве
// создаем динамический массив структур типа CandyBar
CandyBar *candy = new CandyBar [ArSize];
"
переменная ArSize не проинициализированая, там может быть все что угодно даже отрицательное число...
надо ему присвоить какое-то значение, например:
int ArSize = 40;
p.s.
я дальше не смотрел :), может еще есть ошибки...
--------- Україна понад усе!
Ответ отправил: yatagan (статус: 3-ий класс)
Отправлен: 23.08.2005, 17:04 Оценка за ответ: 3 Комментарий оценки: Переменная шициализируется оператором cin>>ArSize; до своего использования в массиве разве этого недостаточно? Даже если и нет, то это не решает проблему...
Отвечает: igor87
Здравствуйте, Filth!
int ArSize; // количество структур в массиве
// создаем динамический массив структур типа CandyBar
CandyBar *candy = new CandyBar [ArSize];
Динамический массив создается без инициализации переменной содержащей его размер, т.е. ArSize. Эта перменная вводится в функции main так что надо перенести строчку
CandyBar *candy = new CandyBar [ArSize];
в функцию main и расположить ее сразу за:
cin>>ArSize;
или на несколько строк ниже, но обязательно до первого использования массива. В вашем случае необходимо расположить строчку до цикла.
// для того чтобы указатель снова указывал на начальную область памяти
// приводим к значению с адресом candy[0]
candy = 0;
ЗАЧЕМ???? candy в данном случае всегда указывает на первый элемент, ведь здесь не используется адресная арифметика. Эту строку удаляем.
// считываем символ "
" доставшийся в наследство от cin
cin.get();
это тоже можно удалить.
Ответ отправил: igor87 (статус: 2-ой класс)
Отправлен: 23.08.2005, 17:32 Оценка за ответ: 4 Комментарий оценки: Да вы правы, перенеся CandyBar *candy = new CandyBar [ArSize]; в main() программа заработала... Однако, если убрать cin.get();как вы предлагаете то я никогда не заполню поле name, т.к. там всегда будет "
"... если убрать строку candy = 0, то снова выдается ошибка...
Отвечает: Raptor1
Здравствуйте, Filth!
У тебя создание массива вообще говоря не происходит, тебе строку
CandyBar *candy = new CandyBar [ArSize];
необходимо поместить в функцию main после ввода значения ArSize
остальное не смотрел
Ответ отправил: Raptor1 (статус: 6-ой класс)
Отправлен: 23.08.2005, 23:59 Оценка за ответ: 5 Комментарий оценки: Спасибо! Уже осознал!!!