Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
742 / 530 / 132
Регистрация: 31.05.2013
Сообщений: 3,022
Записей в блоге: 3
1

Очистка памяти

13.11.2015, 18:08. Показов 1784. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
В .h файле объявляю кнопку так


C++
1
2
public:     // User declarations
TButton * Button;
Далее в процессе работы программы по данному экземпляру создаю кнопку типа так

C++
1
2
Form1-> Button = new TButton(Form1);
Form1-> Button->Parent = Form1;
Теперь мне стала не нужна эта кнопка,я решил ее удалить так

C++
1
delete Form1-> Button;

Ну как оказалось это не правильное удаление, она продолжает висеть в памяти, и мне приходиться делать так

C++
1
2
delete Form1-> Button;
Form1-> Button =NULL;
так как все таки правильно удалить?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.11.2015, 18:08
Ответы с готовыми решениями:

Очистка памяти.
В ходе разработки программы столкнулся с неразрешимой для меня проблемой. Суть её такова:...

Собственный компонент. очистка памяти
Уважаемые коллеги, подскажите новичку. Самодельный компонент имеет защищенный член данных - ...

Работа с графикой TCanvas. Очистка памяти
Привет форумчане, я тут делаю курсовой(Игру) и у меня из кучи идей получилась, куча ошибок....

Очистка графика + очистка формы
Есть две программы: Прямо на форме (через Canvas) рисую правильный многоугольник, но после...

12
Native x86
Эксперт Hardware
5605 / 3348 / 952
Регистрация: 13.02.2013
Сообщений: 10,619
13.11.2015, 18:10 2
Цитата Сообщение от Dinkin Посмотреть сообщение
Ну как оказалось это не правильное удаление, она продолжает висеть в памяти
С чего вы решили?

Попробую угадать: после delete вы попробовали обратиться к ее свойствам/методам и они отработали так, как будто кнопка еще существует?
0
742 / 530 / 132
Регистрация: 31.05.2013
Сообщений: 3,022
Записей в блоге: 3
13.11.2015, 18:11  [ТС] 3
Цитата Сообщение от quwy Посмотреть сообщение
к ее свойствам/методам и они отработали так, как будто кнопка еще существует
все верно, так и проверял
0
Native x86
Эксперт Hardware
5605 / 3348 / 952
Регистрация: 13.02.2013
Сообщений: 10,619
13.11.2015, 18:15 4
Любой блок динамической памяти после высвобождения не затирается мгновенно. Память просто помечается как свободная, но продолжает хранить те данные, которые были туда когда-то записаны. Только при новых операциях с памятью, блок может быть снова выделен для повторного использования и тогда его содержимое будет перезаписано новыми данными. А до этого момента удаленный объект действительно может продолжать выглядеть живым.

А присвоение NULL всего лишь делает невалиной ссылку на участок памяти, где лежат остатки объекта, никакого дополнительного высвобождения памяти при этом не происходит.
1
742 / 530 / 132
Регистрация: 31.05.2013
Сообщений: 3,022
Записей в блоге: 3
13.11.2015, 18:17  [ТС] 5
Ну по логике моей задачи необходимо определять есть ли поле, если есть, то делать действия, выходит мне нужно после удаления делать всегда NULL ?
0
Native x86
Эксперт Hardware
5605 / 3348 / 952
Регистрация: 13.02.2013
Сообщений: 10,619
13.11.2015, 18:19 6
Лучший ответ Сообщение было отмечено Dinkin как решение

Решение

Цитата Сообщение от Dinkin Посмотреть сообщение
выходит мне нужно после удаления делать всегда NULL ?
Да. Это даже считается желательной практикой, т.к. позволяет легко отслеживать ошибки обращения к уже удаленным объектам.
2
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2015, 19:58 7
Есть еще shared_ptr<>, но так как компонент отдается форме во владение этот вариант не подходит.
Кстати как альтернатива - искать компонент в списке формы-родителя.
1
742 / 530 / 132
Регистрация: 31.05.2013
Сообщений: 3,022
Записей в блоге: 3
13.11.2015, 22:09  [ТС] 8
А еще неприятно,что удаляешь владельца и родителя.а все дочерки остаются висеть.

Цитата Сообщение от Avazart Посмотреть сообщение
искать компонент в списке формы-родителя
Ну тут получается строк кода больше(мелочь конечно.а не приятно),..ну и в обще поиск компонентов на форме как то так, задавать имена там или еще че то, стараюсь избегать этого...=)
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.11.2015, 23:23 9
Цитата Сообщение от Dinkin Посмотреть сообщение
А еще неприятно,что удаляешь владельца и родителя.а все дочерки остаются висеть.
Это утверждение не верное.

Добавлено через 1 минуту
Цитата Сообщение от Dinkin Посмотреть сообщение
Ну тут получается строк кода больше(мелочь конечно.а не приятно),..ну и в обще поиск компонентов на форме как то так, задавать имена там или еще че то, стараюсь избегать этого...=)
Больше строк кода?
0
742 / 530 / 132
Регистрация: 31.05.2013
Сообщений: 3,022
Записей в блоге: 3
13.11.2015, 23:49  [ТС] 10
На счет первого это имел ввиду, такое:

C++
1
2
3
4
5
6
7
8
9
TPanel* pan = new TPanel(Form1);
pan->Parent=Form1;
 
TButton *bu= new TButton(pan);
bu->Parent= pan;
 
delete pan;
 
if(bu) ShowMessage("Получилось достучаться");

а на счет второго, такое:

C++
1
2
3
4
5
6
7
8
9
10
TPanel* pan = new TPanel(Form1);
pan->Parent=Form1;
 
TButton *bu= new TButton(pan);
bu->Parent= pan;
bu->Name="Knopka";    //обявляем имя, вдруг кнопок дофига
 
//а теперь удаляем
if(pan->FindComponent("Knopka"))
  delete pan->FindComponent("Knopka");
0
Эксперт С++
8482 / 6149 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.11.2015, 00:57 11
Цитата Сообщение от Dinkin Посмотреть сообщение
if(bu) ShowMessage("Получилось достучаться");
До кого достучатся? До того кто не знает основы С++ ?
Указатели и динамическое выделение памяти это базовые знания, без которых просто нельзя, так что не позорьтесь.
0
1408 / 572 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
14.11.2015, 01:08 12
Цитата Сообщение от Dinkin Посмотреть сообщение
На счет первого это имел ввиду, такое
они не остаются висеть, их уже нет. Но указатель не зануленый.

В делфи есть удобная FreeAndNil вместо Free и проверочная Assigned. В сях вручную надо делать.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
14.11.2015, 11:28 13
FreeAndNil точно так же доступна в С++, как и в Дельфи. Так что не надо ничего делать вручную. Только тебе это не поможет, потому что деструктор владельца не вызывает FreeAndNil, а просто вызывает деструктор всех объектов, которые у него во владении, не обнуляя указатель. И результат будет точно таким же.
0
14.11.2015, 11:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2015, 11:28
Помогаю со студенческими работами здесь

мне нужно создать ползунок памяти, то есть что бы показывало сколько памяти свободно и сколько занято!
Ребят помогите пожалуйста!!! мне нужно создать ползунок памяти, то есть что бы показывало сколько...

Очистка
У меня задача зделать в форме канкулятор на сложение. Все уже написал, не погу понять как зделать...

Очистка
Есть некоторые проблемы с очисткой StringGrid и ComboBox. Вот код:...

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru