|
0 / 0 / 0
Регистрация: 16.02.2009
Сообщений: 8
|
||||||
Ошибка удаления дин. массива AnsiString16.02.2009, 11:49. Показов 3554. Ответов 15
Метки нет (Все метки)
Здравствуйте! Меня уже несколько лет приследует одна и та же проблема, которой я не могу найти решение.
Вкратце: при удалении динамического массива элементов AnsiString иногда возникает исключение "Access violation". Более подробно это выглядит так: Периодически возникает необходимость использовать массивы элементов, в каждом из которых есть AnsiString. Это может быть, как массив AnsiString, так массив структур, в которых есть тот же AnsiString. Для таких массивов я пишу объекты по принципу написал-отладил-зыбыл. После отладки объекта я продолжаю писать другие модули программы и вдруг ни с того, ни с сего возникает исключение на операторе delete в том самом отлаженном объекте, к которому я уже неделю не прикасаюсь. Промучившись с этим исключением два дня и ничего не решив я обычно плюю и за час переделываю все эти гребаные АнсиСтринги в char *. Только после этого я действительно забываю об объекте, потому что он начинает работать, как часы и, к тому же, быстрее. Проблема в том, что я не могу отловить эту ситуацию. Я не понимаю, почему это может происходить и как с этим бороться. Это происходит лишь иногда. Да, да! В это сложно поверить, я знаю, но жестко зафиксировать глюк не удается. Разговоры о "вылезании" за пределы выделенной памяти лишены всякого смысла, т.к. если бы у меня не было достаточно опыта, то с массивами char * я бы уж точно вылез за пределы, а с ними проблем нет. К примеру в одной из программ у меня было выделение памяти для 6 элементов AnsiString (число элементов было фиксировано константой, но массив был динамический - так было нужно). Как обычно в один прекрасные день это все захлебнулось в исключениях. После бессонной ночи я, так и не решив проблему, изменил 6 на 7 и все тут же заработало. Этот проект работает и развивается до сих пор все с той же семеркой и без глюков. Только что появилась возможность "поймать" глюк и я могу привести код, который у меня не работает. После трех нажатий на кнопку Button1 (вызов Button1Click(TObject *Sender) возникает исключение. Строка исключения помечена примечанием.P.S. Код элементарный. Не поленитесь прочитать. Конкретно этот код тестировался на бесплатном Turbo C++, но похожие ошибки возникали и на 5 и на 6 Builder'е.
0
|
||||||
| 16.02.2009, 11:49 | |
|
Ответы с готовыми решениями:
15
из дин. дека в дин. стек (Borland С++)
Непонятная ошибка при инициализации дин. массива |
|
Любитель давать советы
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
|
||||||
| 16.02.2009, 12:19 | ||||||
|
По стандарту положено писать
1
|
||||||
|
Почетный модератор
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
|
|
| 16.02.2009, 12:26 | |
|
а вы не пробывали юзать TStringList, в вашем случае он как раз подойдет...
0
|
|
|
0 / 0 / 0
Регистрация: 16.02.2009
Сообщений: 8
|
||||||
| 16.02.2009, 14:08 [ТС] | ||||||
|
WooDooMan, обратите внимание на
![]() Alexiski, спасибо. Пишу на Си уже давно, но этого не видел ни разу. Я так понял квадратные скобки нужны, чтобы прога знала, что удаляется массив, а не один элемент. Если да, то возникает вопрос: неужели я каждый раз перед удалением памяти должен проверять размер массива и, в зависимости от результата проверки, использовать либо delete, либо delete[]?
0
|
||||||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||
| 16.02.2009, 14:19 | ||
|
Для массивов ты всегда обязан использовать квадратные скобки. Иначе память не освобождается.
Добавлено через 1 минуту 35 секунд http://cplusplus.com/doc/tutorial/dynamic.html
0
|
||
|
0 / 0 / 0
Регистрация: 16.02.2009
Сообщений: 8
|
||
| 16.02.2009, 14:35 [ТС] | ||
|
Все-таки неясно, зачем эти скобки. Во-первых, я так и не нашел ответа на свой предыдущий вопрос (если кто знает, подскажите), а во-вторых, из него вытекает еще один: если скобки указываются пустыми, значит компилятор (прога) знает размер массива. На хрена тогда их вообще указывать если прога знает его размер и может сама использовать delete для массивов длины 1 и delete[] для массивов длины >1?! Добавлено через 1 минуту 27 секунд P.S. Только что увидел ссылку. Читаю.
0
|
||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||
| 16.02.2009, 14:42 | ||
|
А откуда твоя прога узнает, что, память до этого была выделена для массива, а не для одного объекта? Ты и указываешь это. Отсюда и ответ на твои вопросы.
0
|
||
|
0 / 0 / 0
Регистрация: 16.02.2009
Сообщений: 8
|
|||||||
| 16.02.2009, 14:56 [ТС] | |||||||
![]() И все-таки про мои вопросы Что, действительно проверять каждый раз? Т.е. какая разница между использованием этих двух операторов для особождения памяти, выделенной вот так:
0
|
|||||||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||
| 16.02.2009, 15:39 | ||
|
Да, блин, ничего не проверять! Если у тебя массив:
delete [размер(не обязательно)] если не массив delete Добавлено через 3 минуты 7 секунд
0
|
||
|
0 / 0 / 0
Регистрация: 16.02.2009
Сообщений: 8
|
|
| 16.02.2009, 15:40 [ТС] | |
|
__
0
|
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|||||||||||
| 16.02.2009, 15:51 | |||||||||||
|
Че до тебя никак не дойдет, что
Добавлено через 9 минут 32 секунды Yak, вообще если твоей логике следовать, то можно придраться к тому, что массив, на самом деле, не массив, а просто ряд объктов расположенных друг за другом в памяти. Ничего более...какой же это массив. А один элемент - это полюбому массив. Просто из одного элемента. Ты что, думаешь на машинном уровне там массивы в памяти лежат? Ага, щас... Просто числа, без всяких индексов и т. д.. Просто числа в памяти. Напишу:
![]() Массив...не массив...
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 16.02.2009
Сообщений: 8
|
||
| 16.02.2009, 15:53 [ТС] | ||
|
Там по ссылке написано, что надо так! И все, а почему - не ясно. Разложу по полочкам: То, что вы мне объяснили очень просто и понятно, а главное максимально доступно. 1. Если выделить память для 1 элемента (объекта), то освобождать ее надо без скобок. 2. Если выделить память для массива элементов, то освобождать ее надо со скобками. Все просто. А если я выделил память для массива, но из одного элемента?! То как? Аааа, со скобками без скобок! ...или без скобками со скобок... Хммм... Добавлено через 51 секунду Можете уже не париться. Я нашел http://www.parashift.com/c++-f... #faq-16.13
0
|
||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 16.02.2009, 15:53 | |
|
все там написано, голову включи.
0
|
|
|
0 / 0 / 0
Регистрация: 16.02.2009
Сообщений: 8
|
||
| 16.02.2009, 16:04 [ТС] | ||
|
Ладно, все равно спасибо. Добавлено через 2 минуты 46 секунд P.S. Да, и над речью своей Вам следует поработать. Я вам все-таки не сосед.
0
|
||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 16.02.2009, 16:14 | |
|
А так как, я уже упоминал выше, что возвращается указатель на первый элемент, то массив из одного элемента, то удалить его я могу, как мне удобней. Хотя, правильней, в любом случае будет использовать [].
P. S. мне без разницы, сосед, не сосед. Русский тоже, вроде, правильный.
0
|
|
|
0 / 0 / 0
Регистрация: 16.02.2009
Сообщений: 8
|
||||||||
| 17.02.2009, 09:36 [ТС] | ||||||||
![]() Добавлено через 14 минут 9 секунд Вчера потестил незамысловатую программу:
P.S. Alexiski отдельное спасибо. Вопрос, озвученный в шапке темы решен с его помощью.
0
|
||||||||
| 17.02.2009, 09:36 | |
|
Помогаю со студенческими работами здесь
16
Как увеличить размер дин. массива средствами С++ Работа с class ами. Заполнение дин. массива типа class Крашится программа при попытке присваивания значения элементу дин-го массива Добавление и удаление элементов дин массива Создание дин массива для структуры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|
|
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2.
Данный документ берёт данные из другого нетипового документа. . .
|
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
|
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать программный контроль на предмет проведения документа. . .
|
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача:
1. Реализовать контроль заполнения реквизита. . .
|