Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

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

Удаление динамически созданных объектов - C++ Builder

05.02.2017, 08:20. Просмотров 370. Ответов 18
Метки нет (Все метки)

Приветствую. Вопрос поднимался, но что то не получается!
Создаю объекты в цикле
C++
1
2
3
4
5
6
7
8
PanMap[TagMap] = new TPanel(Panel1);
PanMap[TagMap]->Tag = TagMap;
MapNameI[TagMap]=new TDeviceImage(Form1);
MapNameI[TagMap]->Tag= TagMap
if(ML[MAP].Pp)
MapNameI[TagMap]->Parent=PanMap[TagMap];
else
MapNameI[TagMap]->Parent=StringGrid2;
Как их потом удалять бесследно?
if(PanMap[i])delete PanMap[i];
if(MapNameI[i])delete MapNameI[i];
ошибку выдает на второй раз. Да и в списке в дебагере видно, что объект не 0 становится..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2017, 08:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление динамически созданных объектов (C++ Builder):

Удаление динамически созданных объектов - C++ Builder
Помогите плз. Пишу курсач по МИО. Вот ща работаю над интерфейсом. Я по нажатию кнопку создаю динамически объект edit. Хочу теперь при...

События динамически созданных объектов - C++ Builder
Всем привет :) Вопрос в том, как сделать отдельные события для каждой динамически созданной кнопки ? Пока получилось только для всех...

События динамически созданных объектов - C++ Builder
Доброго всем времени суток! Суть вопроса такова: я динамически в пользовательском классе создаю объект класса TTimer. Мне необходимо...

Сохранение данных из динамически созданных объектов в PageControl - C++ Builder
Всем привет. Суть проблемы на форме разместил компонент PageControl , в нём динамически создаю вкладки и Edit. Далее например хочу в...

Обработка событий динамически созданных объектов в С++ Builder - C++ Builder
Добрый день! Подскажите, пожалуйста, возможное решение следующей проблемы... Есть некая форма. На форме присутствует элемент...

Удаление динамически созданных TSpeedButton - C++ Builder
Имеется такой вот код, оптимизации 0, но сейчас не об этом. При попытке удалить массив из But, происходит ошибка. Project...

18
Fulcrum_013
699 / 764 / 74
Регистрация: 14.12.2014
Сообщений: 6,036
Завершенные тесты: 3
05.02.2017, 08:48 #2
Sergey_03 PanMap и MapNameI какого типа? Вполне возможно стоит их во владеющий список закинуть вместо того чтобы лисапед на сырых указателях городить.

Добавлено через 3 минуты
Цитата Сообщение от Sergey_03 Посмотреть сообщение
Да и в списке в дебагере видно, что объект не 0 становится..
А с каких делов указатель должен сам по себе обнуляться если удалили то на что он ссылается?
C++
1
2
3
4
5
6
7
if(PanMap[i]){
 delete PanMap[i];
  PanMap[i]=NULL;
} //для x32 компилятора
// для x64 можно вот так
delete PanMap[i];
PanMap[i]=nullptr;
2
k399et
20 / 20 / 7
Регистрация: 06.11.2013
Сообщений: 59
05.02.2017, 10:01 #3
delete X - функция освобождения памяти по адресу X. Она не обнуляет сам X-указатель.
1
Sergey_03
20 / 8 / 0
Регистрация: 15.12.2014
Сообщений: 569
05.02.2017, 10:23  [ТС] #4
а почему при цикле ++ от меньшего к большему ошибка на последних удалениях, а при цикле -- от большего к меньшему все нормально удаляется?
0
k399et
20 / 20 / 7
Регистрация: 06.11.2013
Сообщений: 59
05.02.2017, 10:35 #5
А нельзя бы посмотреть более подробный код? Где определяются массивы и переменные?
1
Fulcrum_013
699 / 764 / 74
Регистрация: 14.12.2014
Сообщений: 6,036
Завершенные тесты: 3
06.02.2017, 03:37 #6
Цитата Сообщение от Sergey_03 Посмотреть сообщение
а почему при цикле ++ от меньшего к большему ошибка на последних удалениях, а при цикле -- от большего к меньшему все нормально удаляется?
А потому что в VCL/FireMonkey пользуются двунаправленные указатели и слабовладеющие контейнеры. Т.е. для некоторых контейнеров начиная с TObjectList при удалении элемента он из деструктора оповещает контейнеры в которых содержится и они удаляют ссылку на него из себя.
1
Sergey_03
20 / 8 / 0
Регистрация: 15.12.2014
Сообщений: 569
06.02.2017, 10:46  [ТС] #7
Цитата Сообщение от k399et Посмотреть сообщение
А нельзя бы посмотреть более подробный код
уже все понятно, спасибо.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
слабовладеющие контейнеры
Мысль! У меня же там карта в карте может создаваться по дереву и её индекс - абсолютный индекс нода этого дерева. Если удалять её и в ней что-то есть - это что-то тоже удаляется, а при обратном цикле при этих условиях такое не возможно.
0
Fulcrum_013
699 / 764 / 74
Регистрация: 14.12.2014
Сообщений: 6,036
Завершенные тесты: 3
06.02.2017, 10:53 #8
Цитата Сообщение от Sergey_03 Посмотреть сообщение
Мысль!
Кстати так о птичках подобное дерево можно (и по большому счету нужно) собрать на потомках TComponent, который имеет слабовладеющий массив дочерних компонентов. В результате достаточно будет удалить только верхний нод дерева, остальное удалится само.
1
Sergey_03
20 / 8 / 0
Регистрация: 15.12.2014
Сообщений: 569
06.02.2017, 11:07  [ТС] #9
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
собрать на потомках
Так и получается вообщем то. В первом посте немного не так
Формируется структура по дереву с указанием родителя узла(если уровень узла не 0 конечно)
и
C++
1
2
3
4
if(ML[TagMap].Pp)
MapNameI[TagMap]->Parent=PanMap[ML[TagMap].ParAbInd];
else
MapNameI[TagMap]->Parent=StringGrid2;
по этому принципу и отрабатывает.
0
Fulcrum_013
699 / 764 / 74
Регистрация: 14.12.2014
Сообщений: 6,036
Завершенные тесты: 3
06.02.2017, 11:26 #10
Цитата Сообщение от Sergey_03 Посмотреть сообщение
Так и получается вообщем то. В первом посте немного не так
C указанием Parent так не получится. Удаляет подноды не Parent а Owner, и Owner-а переставить нельзя, он задается в конструкторе и остается неизменным до удаления.
1
Sergey_03
20 / 8 / 0
Регистрация: 15.12.2014
Сообщений: 569
06.02.2017, 18:10  [ТС] #11
А как в этом случае обнулить указатель?
C++
1
2
3
4
5
6
7
8
for(int ii=0;ii<StringGrid2->ControlCount;ii++)
    {
        if(StringGrid2->Controls[ii]->ClassNameIs("TDeviceImage"))
            {
                delete static_cast<TDeviceImage*>(StringGrid2->Controls[ii]);
                //static_cast<TDeviceImage*>(PanMap[m]->Controls[ii]=NULL);
            }
    }
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24029 / 16010 / 4848
Регистрация: 22.10.2011
Сообщений: 28,336
Записей в блоге: 5
06.02.2017, 19:00 #12
Просто присвоить NULL:
C++
1
StringGrid2->Controls[ii] = NULL;
1
Sergey_03
20 / 8 / 0
Регистрация: 15.12.2014
Сообщений: 569
06.02.2017, 19:43  [ТС] #13
Цитата Сообщение от volvo Посмотреть сообщение
Просто присвоить NULL
Но не хочет, пишет [BCC32 Error] Unit1.cpp(6230): E2247 'TWinControl::Controls' is not accessible
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
24029 / 16010 / 4848
Регистрация: 22.10.2011
Сообщений: 28,336
Записей в блоге: 5
06.02.2017, 20:04 #14
Не понял. Строкой выше все нормально, а тут - не хочет?
1
Sergey_03
20 / 8 / 0
Регистрация: 15.12.2014
Сообщений: 569
06.02.2017, 20:07  [ТС] #15
Цитата Сообщение от volvo Посмотреть сообщение
а тут - не хочет?
да, не хочет.
На StringGrid2->Controls[ii] = NULL; пишет
[BCC32 Error] Unit1.cpp(6231): E2247 'TWinControl::Controls' is not accessible
На static_cast<TDeviceImage*>(StringGrid2->Controls[ii] = NULL);
пишет
[BCC32 Error] Unit1.cpp(6231): E2492 Properties may only be assigned using a simple statement, e.g. "prop = value;"
0
06.02.2017, 20:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2017, 20:07
Привет! Вот еще темы с ответами:

Удаление динамически-созданных компонентов - C++ Builder
Использую класс, компонентами которого кроме всего прочего, являются StaticText и Edit, графическое изображение. Создаю экземпляр класса...

Удаление динамически созданных вкладок - C++ Builder
Подскажите как сделать? Создаю вкладки по нажатию кнопки void __fastcall TNewProject::CreateClick(TObject *Sender) { static...

Удаление с формы динамически созданных Memo - C++ Builder
Динамически создаю n-ое количество memo. Затем пытаюсь удалить их всех с формы: for (int i = 0; i &lt; ComponentCount; i++) { ...

Удаление динамически созданных вкладок PageControl - C++ Builder
Всем доброго времени суток. Создаю при открытие формы вкладки на PageControle. Открываю форму так: ...


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

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

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