|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|||||||||||
Ошибки, связанные с деструктором05.04.2013, 09:36. Показов 2543. Ответов 20
Метки нет (Все метки)
Здравствуйте Всем! Вот такой вопрос. Может плохо сформулированный, но не знаю как
и взяться за него! В C++Builder v.6 сделан класс (например TForm_Unit). Этот класс в своем конструкторе создает примерно полтора десятка динамических VCL-компонентов (ГроупБокс, Клавиши, Метки, Едит, СтрингГрид). В этом-же классе определен деструктор, который все эти динамические VCL-компоненты, как и учат отцы-основатели, по очереди удаляет. Типа:
когда выполняются определенные действия (например сохранение всей информации в файл) выскакивают непонятные ран-тайм сообщения об ошибках. Типа того, что где-то прочитаны неверные адреса! Доступ к чему-то запрещен! С самим сохранением в файл все нормально, т.к. оно производится правильно и проверялось до этого отдельно. Самое интересное! Если заменить мой расколбасанный деструктор на простое:
то Все Работает Нормально! Как часы! Что бы это означало? Заранее Всем благодарен за умные и полезные мысли! ...
0
|
|||||||||||
| 05.04.2013, 09:36 | |
|
Ответы с готовыми решениями:
20
Ошибки связанные с wininet
Ошибки связанные с 'navigator object'. |
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
| 05.04.2013, 10:29 | |
|
Okonenko Stanis, во-первых, покажите как создаете объекты на форме. Во-вторых, при вызове delete pointer; не нужно проверять pointer на NULL.
0
|
|
|
Диссидент
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
|
|
| 05.04.2013, 10:34 | |
|
Okonenko Stanis, Если ваш класс является владельцем (Owner) ваших компонентов, то он их и удалит
0
|
|
|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|||||||||||
| 05.04.2013, 17:35 [ТС] | |||||||||||
|
- Конструктор моего класса такой:
_top, _left - координаты расположения всего хозяйства на Форме. А внутри конструктора по очереди создаются все динам. VCL-компоненты. Сначала создается ГроупБокс:
только в качестве предка (Parent) им задается уже выше созданный ГроупБокс. - Да, появились новые сведения - при сохранении в файл сразу после сохранения почему-то вызывается злополучный деструктор!!! Сохранение делается с помощью перегруженного оператора вставки!
0
|
|||||||||||
|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|||||||||||
| 06.04.2013, 00:08 [ТС] | |||||||||||
|
- Всего там очень много. Я уже говорил, создается полтора десятка динам.
VCL-компонентов. Но набросок я могу привести ...
оператора вставки вызывается деструктор! Может быть дело в том, что вызывается оператор вставки из метода самого класса TForm_Unit. Точнее так: - одним из динам. VCL-компонентов данного класса, создаваемых в конструкторе данного класса является - Кнопка (B_Save). Обработчик ее нажатия мышью (B_SaveClick) является членом класса TForm_Unit. А вызов перегруженного, дружественного оператора вставки осуществляется примерно так:
0
|
|||||||||||
|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|
| 07.04.2013, 10:52 [ТС] | |
|
- А я никогда не говорил, что это VCL-компонент. Это обычный класс, который
создает много динамических VCL-компонентов. Я набросал маленькое тестовое приложение. Оно вызывает перегруженный оператор вставки из 1) метода самого класса и 2) из метода основной формы. Несанкционированный вызов деструктора класса TCls происходит в обеих случаях. У кого-ни-будь есть мысли ПОЧЕМУ? ... - Подробные пояснения к приложению даны в файле реализации основной формы (Main_Form_Unit.cpp). Меткой //(BP) помечена строка, где надо поставить точку останова, чтобы видель несанкционированное срабатывание деструктора.
0
|
|
|
|
||
| 07.04.2013, 13:26 | ||
![]() При вызове данного оператора создается копия инстанции класса с помощью конструктора копирования, предоставляемого компилятором за неимением такового в объявлении класса. Соответственно, в этой копии оказываются все указатели из оригинальной инстанции. Время жизни копии равно времени выполнения функции оператора - по окончании все объекты в стэке разрушаются, в том числе и наша копия. Вызывается деструктор, память по указателям освобождается - все. Теперь указатели в оригинальной инстанции класса неверны, обращение по ним вызывает access violation. Чтобы выйти из положения, тщательно следи за возможностью явного или неявного копирования, либо напиши свой конструктор копирования, который для копии будет выделять собственную память под компоненты из оригинала.
1
|
||
|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|
| 07.04.2013, 16:08 [ТС] | |
|
- Огромное спасибо Вам BRcr и Avazart! Есть над чем подумать и поэкспериментировать на
моем пробном приложении. Еще раз спасибо! Если что снова не пойдет - сообщу. ...
0
|
|
|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|
| 08.04.2013, 15:43 [ТС] | |
|
- Не удается мне добиться ничего вразумительного. Действительно при вызове
перегруженного оператора вставки вызывается конструктор копирования. Но видимо я что-то с ним не так делаю! Все равно вылезают ошибки типа Access Violation. Прошу Вас BRcr, если Вам не затруднительно, помогите в моем тестовом приложении "Test_operator.rar" разрулить ситуацию с помощью конструктора копирования!
0
|
|
|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|
| 09.04.2013, 10:32 [ТС] | |
|
- Отвечаю на Ваши замечания Avazart. Класс назывался TForm_Unit потому, что
исходная программа, где вылезли все эти сложности имела дело с химией и ее "формульными единицами". Но это вообще все равно как назвать. Можно конечно передать экземпляр в оператор вставки по ссылке, но ведь во всех учебниках почему-то передают именно по значению! Можно конечно сделать этот класс VCL-компонентом, но во-первых это будет какой-то непонятный химический компонент, который и назвать-то не знаешь как! А во-вторых что это все даст с точки зрения проблемы? Хотелось бы раз и навсегда разобраться, чтобы в дальнейшем свободно пользоваться принципом: - создал САМ динамический VCL-компонент, САМ его и удаляешь!
0
|
|
|
|
|||
| 09.04.2013, 14:23 | |||
|
Так что передавай по ссылкам, указателям. Лучше всего иногда по константным ссылкам для самоконтроля. Еще очень удобно бывает передавать и возвращать std::auto_ptr<>, но тут надо понимать суть работы этого контейнера.
0
|
|||
|
|
|||
| 09.04.2013, 15:43 | |||
|
Всегда передается по ссылке что бы не копировать лишний раз объект. Так почему сразу использовать форму - ведь это сам по себе класс! О создании своих компонентов VCL есть Архангельском. Добавлено через 3 минуты В общем непонятно желания лезть в ООП не зная его принципы.
0
|
|||
|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|
| 09.04.2013, 18:15 [ТС] | |
|
- Да, передача объекта-класса в перегруженный оператор вставки по
ссылке конечно решает проблему! Конструкторы копирования не вызываются. Следовательно, деструкторы не вызываются. Деструктор вызывается один раз когда удаляется сам объект. В общем - все нормально! Просто хотелось знать больше и уметь решать и такие сложные ситуации. Еще раз спасибо Вам Avazart и BRcr за полезные мысли! Кстати, где лучше всего почитать о таких нетривиальных случаях?
0
|
|
|
6 / 6 / 3
Регистрация: 06.02.2013
Сообщений: 71
|
|
| 10.04.2013, 16:17 [ТС] | |
|
- Я имею в виду "не тривиальность" в том смысле, что в данном примере можно с легкостью
уйти от этих "деструкторов", но ведь бывают и другие ситуации ... И надо уметь их решать ... Еще раз спасибо Всем за помощь и подсказки! В том числе и за литературу. Думаю, что тема уже исчерпана!
0
|
|
| 10.04.2013, 16:17 | |
|
Помогаю со студенческими работами здесь
20
PCAP и связанные с ним ошибки Ошибки связанные с ntdll.dll Ошибки в коде, связанные с boost Ошибки связанные с односвязным списком Ошибки validator.w3.org связанные с Joomla Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита табличной части. . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|