powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректное удаление объектов из памяти. Как правильней?
10 сообщений из 10, страница 1 из 1
Корректное удаление объектов из памяти. Как правильней?
    #34856703
Aleks_U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа. Вопрос такой. Есть родительский класс TParent* и несколько дочерних классов TChild1, TChild2 и т.д. Вопрос в том, как правильней удалять созданные экземпляры дочерних классов с помощью delete. Аналогичный вопрос про указатели типа void.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
TChild1* cld1=new TChild1();
TChild2* cld2=new TChild2();
TParent *par1=cld1, par2=cld2;
void *vd1=cld1; *vd2=cld2;

//так сойдет???
delete par1;
delete par2;

//или лучше вот так???
delete (TChild1*)par1;
delete (TChild2*)par2;

//аналогично с нетипизированными (void) указателями
//так сойдет???
delete vd1;
delete vd2;

//или лучше вот так???
delete (TChild1*)vd1;
delete (TChild2*)vd2;
У меня есть подозрения, что в при удалении без приведения типа память может не полностью освободиться.

P.S. Это всё к задаче об хранении набора обектов TChild1, TChild2 в списке TList, а именно корректному освобождению памяти при отчистке списка.

P.P.S. Пишу в CBuilder.
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34856732
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_U пишет:

> //аналогично с нетипизированными (void) указателями
> //так сойдет???
> delete vd1;
> delete vd2;

Если тебе дектрукторы вызывать не надо, то сойдет ...

> У меня есть подозрения, что в при удалении без приведения типа память
> может не полностью освободиться.

Освободится полностью.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34856854
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, если деструктор виртуальный
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34856956
Aleks_U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. проблема тут в вызове деструкторов? Тогда поясните, пожалуйста, правильно ли я понимаю.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TChild* cld=new TChild;
TParent *par=cld;
void* vd=cld;

//Будет вызван деструктор и вся память динамически выделяемая 
//внутри класса должна освободиться (если её освобождение в деструкторе прописано)
delete (TChild*)par;
delete (TChild*)vd;

//Будет вызван деструктор TParent, со всеми вытекающими последствиями
delete par;

//Деструктор не будет вызван вообще
delete vd;
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34857015
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если деструктор виртуальный - то не важно, удаляешь ты указатель на базовый или указатель на потомок: все равно вызовется деструктор потомка.

если деструктор обычный - вызовется соответствующий классу указателя.

То есть в этом случае деструктор ведет себя как обычная функция.
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34857038
Aleks_U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 StepLq

Спасибо. А если указатель типа void, то деструктор вообще не вызывается???
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34857063
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не не вызывается, у него же объектного типа нет
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34857107
Aleks_U
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё раз всем огромное спасибо :)
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34858126
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleks_U пишет:

> TChild* cld=new TChild;
> TParent *par=cld;
> void* vd=cld;
>
> //Будет вызван деструктор и вся память динамически выделяемая
> //внутри класса должна освободиться (если её освобождение в деструкторе прописано)
> delete (TChild*)par;
> delete (TChild*)vd;

Такое делать на самом деле нельзя. Ты не будешь всегда знать,
что это именно TChild*. Такое делают через виртуальный деструктор
в предке. И удаление через указатель на предка.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Корректное удаление объектов из памяти. Как правильней?
    #34859154
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К void* указатели вообще приводить не следует.
Приведение в стиле Си (TChild1*) также следует избегать.
Действительно, в данной ситуации деструкторы должны быть виртуальными.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректное удаление объектов из памяти. Как правильней?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]