0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 34
1

Access Violation при попытке удалить "существующий объект"

14.05.2015, 22:58. Показов 1322. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой вот код.
C++
1
2
3
4
5
6
    
for (int i = 0; i < Form1->ComponentCount; i++) {
    if (((TImage*)Form1->Components[i])->Hint == secondMaze[gameI1][gameJ1]) {
        delete Form1->Components[i];
    }
}
Примерно через раз(Это не точно, ибо после ошибки выключал, но ошибки ловил не каждый раз) вываливает ошибку Access Violation. Как такое может быть? Ведь код выполняется, если объект найден.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2015, 22:58
Ответы с готовыми решениями:

Структура "Список", Access Violation при вызове функции
не могу найти ошибку в коде. программа реализует стандартные операции с односвязным списком...

Ошибка при создании массива "Access violation. Link terminated"
создается массивы float X, Y, Z, E,F,Fan; все отлично но при попытке увеличить размер до...

Ошибка при компиляции: "Access violation"
когда открываю проект, и хочу его прокомпилировать, выскакивает ошибка? как мне ее убрать и как...

Ошибка при компиляции: "Access violation at adress 32F7E924 in module 'CC32150MT.DLL'"
При попытке считывания с файла вылетает ошибка. Access violation at adress 32F7E924 in module...

7
Практикантроп
4787 / 2686 / 518
Регистрация: 23.09.2011
Сообщений: 5,747
14.05.2015, 23:10 2
Лучший ответ Сообщение было отмечено murphy как решение

Решение

Потому что неверно. У вас же в цикле каждый компонент формы "пробуется" на принадлежность классу TImage. По правилам сначала нужно отфильтровать (ClassNameIs ) из всех компонентов именно картинки, и с ними уже можно так обращаться. ( Hint -то по идее у подавляющего большинства компонентов присутствует, но тут - дело принципа ).
1
0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 34
14.05.2015, 23:13  [ТС] 3
Цитата Сообщение от nick42 Посмотреть сообщение
Потому что неверно. У вас же в цикле каждый компонент формы "пробуется" на принадлежность классу TImage. По правилам сначала нужно отфильтровать (ClassNameIs ) из всех компонентов именно картинки, и с ними уже можно так обращаться. ( Hint -то по идее у подавляющего большинства компонентов присутствует, но тут - дело принципа ).
Значит дописать что-нибудь типа
C++
1
 && Form1->Components[i]->ClassName == "TImage"
?
0
Практикантроп
4787 / 2686 / 518
Регистрация: 23.09.2011
Сообщений: 5,747
14.05.2015, 23:13 4
И вдобавок такого рода цикл лучше начинать "сверху". А то удалите из середины..., индекс цикла уже инкрементирован, а под прежним индексом компонент окажется пропущенным.
0
0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 34
14.05.2015, 23:14  [ТС] 5
Цитата Сообщение от nick42 Посмотреть сообщение
И вдобавок такого рода цикл лучше начинать "сверху". А то удалите из середины..., индекс цикла уже инкрементирован, а под прежним индексом компонент окажется пропущенным.
Там только один элемент удаляется. Надо break поставить. Спасибо, что тыкнули.
0
Практикантроп
4787 / 2686 / 518
Регистрация: 23.09.2011
Сообщений: 5,747
14.05.2015, 23:16 6
Цитата Сообщение от murphy Посмотреть сообщение
Значит дописать что-нибудь типа
Нет, первый анализ - на принадлежность классу, и только в положительном случае вот это: ((TImage*)Form1->Components[i]. А вообще, мэтры С++ (и С) избегают такого явного указания и применяют ..._cast .
0
0 / 0 / 1
Регистрация: 14.05.2015
Сообщений: 34
14.05.2015, 23:18  [ТС] 7
Цитата Сообщение от nick42 Посмотреть сообщение
Нет, первый анализ - на принадлежность классу, и только в положительном случае вот это: ((TImage*)Form1->Components[i]. А вообще, мэтры С++ (и С) избегают такого явного указания и применяют ..._cast .
Окей. Понял Вас. К сожалению, я не мэтр, да и сроки поджимают. Курсовую сдам, и обязательно посмотрю про ..._cast.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32591 / 21060 / 8134
Регистрация: 22.10.2011
Сообщений: 36,332
Записей в блоге: 8
14.05.2015, 23:21 8
Цитата Сообщение от nick42 Посмотреть сообщение
и применяют ..._cast
Не ..._cast, а именно dynamic_cast, чтобы, в случае невозможности каста (а значит, в случае когда тип компонента не тот, который нужен) вернулся NULL...
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2015, 23:21
Помогаю со студенческими работами здесь

При запуске уже скомпелированной программы ошибка: "Access violation at address in module. Write of address."
Здравствуйте, написал программу для расчета по готовым формулам с использованием динамических...

Ошибка access violation in adress. in module "dclite60.bpl"
Выдает ошибку access violation in adress... i module dclite60.bpl. Как ее исправить? ...

Подключение библиотеки вызывает ошибку "access violation"
При запуске программы вылетает ошибка access violation at address 00000. Read of address 00000000....

Ошибка "Access violation at address 006428B3 in module"
Программа не запускается, появляется лишь эта ошибка и на этом все. Помоги, пожалуйста, решить эту...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru