|
|
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Задачей было найти потери памяти в проекте. Причина оказалась вот в чем. Имеется шаблонный класс "Динамический список " или просто class_List , т.е. тип данных списка определяется шаблонно. Есть class_A , который создает объект class_List для хранения данных типа *class_Data . Класс class_List пользует new & delete для создания/удалени я своих элементов. Есть потомок от class_Data cl_child_Data . Так вот один из потомков класса Class_A , загоняет в список объекты (исп. указатель на объект) не *class_Data , а *cl_child_Data , т.е. его потомка , что вполне допустимо. Но при очистке памяти оператором delete удаляется естественно предок (class_Data), а не наследник, который фактически туда помещен - отсюда и лики. На самом деле схема использования этих классов и их наследников очень громоздка и они выполняют сложные вычисления, поэтому для исправления проблемы с утечкой памяти желательно минимальное вмешательство, чтобы не навредить. Т.е. нужно устранить лики и не более. Хотел бы услышать толковые идеи по решению этой проблемы. Прошу учесть при объяснении, что я новичок и не автор проекта. Можно ли как-нидь сделать "умный" delete, чтобы он сам "знал" какой тип объекта находится в памяти и грамотно удалял потомка, а не предка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:11 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
деструкторы class_Data, cl_child_Data должны быть виртуальные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:14 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Tubrik Но при очистке памяти оператором delete удаляется естественно предок (class_Data), а не наследник, который фактически туда помещен - отсюда и лики. Не пойму, что значит? Список class_List самописный? В cl_child_Data дестуктор виртуальный, переопределен нормально? cl_child_Data выделяет память в ходе работы, в деструкторе она освобождается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:19 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Голенков Владимирдеструкторы class_Data, cl_child_Data должны быть виртуальные очищает память class_List, но так как он удаляет данные типа class_Data, хотя хранит на самом деле cl_child_Data. Т.е. до деструктора cl_child_Data дело в любом случае не доходит, если я правильно понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:19 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Tubrik Голенков Владимирдеструкторы class_Data, cl_child_Data должны быть виртуальные очищает память class_List, но так как он удаляет данные типа class_Data, хотя хранит на самом деле cl_child_Data. Т.е. до деструктора cl_child_Data дело в любом случае не доходит, если я правильно понимаю. Если ты сделаешь деструкторы виртальные, то указатель на объект твоего класса предка (созданного потомком) будет содержать виртуальную таблицу, в которой будет храниться деструктор потомка, который и вызовется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:26 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Еще вариант - удалять класс, приведенный к классу потомка Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:29 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
KGP Tubrik Но при очистке памяти оператором delete удаляется естественно предок (class_Data), а не наследник, который фактически туда помещен - отсюда и лики. Не пойму, что значит? Список class_List самописный? В cl_child_Data дестуктор виртуальный, переопределен нормально? cl_child_Data выделяет память в ходе работы, в деструкторе она освобождается? class_List самописный. Он же и выделяет память под объекты и он же удаляет, к примеру: class_Data *n = new class_Data(); n = [объект класса cl_child_Data]; а удаляется: delete [как объект класса class_Data]; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:31 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
AkhЕще вариант - удалять класс, приведенный к классу потомка Код: plaintext 1. так работает, но тут нельзя предсказать какой именно из потомков будет использован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:35 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
AkhЕще вариант - удалять класс, приведенный к классу потомка Код: plaintext 1. Да нельзя так ПРИНЦИПИАЛЬНО! to Tubrik: Я спрашивал деструктор виртуальный, переопределен? скинь определение класса class_Data и cl_child_Data на уровне определения ( реализацию - деструкторов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 18:49 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
KGP AkhЕще вариант - удалять класс, приведенный к классу потомка Код: plaintext 1. Да нельзя так ПРИНЦИПИАЛЬНО! to Tubrik: Я спрашивал деструктор виртуальный, переопределен? скинь определение класса class_Data и cl_child_Data на уровне определения ( реализацию - деструкторов) Почему так нельзя, я так сделал в одном месте, где точно был уверен, что нужно удалить потомка. Деструктор не виртуальный и не переопределен. Еще не могу понять, как тут может помочь деструктор объекта, если он ничего не должен удалять, а должен быть правильно удален сам объект cl_child_Data. Наследование происходит не напрямую от class_Data, а через другие объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 19:04 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Tubrik Почему так нельзя ... Дело вашенское, убеждать вас не буду. ИМХО - виртуалить и переопределить деструктор, где и освобождать выделенную ранее этим инстансом память (не память под инстанс). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 20:04 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Tubrik KGP AkhЕще вариант - удалять класс, приведенный к классу потомка Код: plaintext 1. Да нельзя так ПРИНЦИПИАЛЬНО! to Tubrik: Я спрашивал деструктор виртуальный, переопределен? скинь определение класса class_Data и cl_child_Data на уровне определения ( реализацию - деструкторов) Почему так нельзя, я так сделал в одном месте, где точно был уверен, что нужно удалить потомка. Потому, что в народе это называется "Закат солнца вручную". Tubrik Деструктор не виртуальный и не переопределен. Еще не могу понять, как тут может помочь деструктор объекта, если он ничего не должен удалять, а должен быть правильно удален сам объект cl_child_Data. В качестве отладки, вставьте во все конструкторы fprintf(log, "Constructing object %x\n", this); И в деструкторы fprintf(log, "Destructing object %x\n", this); Запустите программу и проверьте что(сколько) реально создается и что (сколько)реально удаляется. Потом зделайте деструкторы виртуальными и сравните репорты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2006, 20:18 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
KGP AkhЕще вариант - удалять класс, приведенный к классу потомка Код: plaintext 1. Да нельзя так ПРИНЦИПИАЛЬНО! Только если уверен. Есстественно, будет правельно с виртуальным диструктором, но так тоже не запрещается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 09:53 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Akh Только если уверен. Есстественно, будет правельно с виртуальным диструктором, но так тоже не запрещается. Кем, кому запрещается?! ... я Вам и остальным (кроме своих подчиненных) разрешаю это Ваши проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 10:41 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
KGP Akh Только если уверен. Есстественно, будет правельно с виртуальным диструктором, но так тоже не запрещается. Кем, кому запрещается?! ... я Вам и остальным (кроме своих подчиненных) разрешаю это Ваши проблемы. 1. Вполне адекватное решение. 2. Молодец, что ж сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 10:46 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Akh KGP БРЭЙК... прелесть плюсов - мона всё, или практически всё..Шаги к разумному каждый находит сам. В книгах ,либо из горького опыта. Думаю стоит не цепляться за слова, а просто привести примеры...из жизни (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 13:25 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Разработанные, используемые в различных готовых и рабочих проектах различными разработчиками, плохо спроектированные с точки зрения расширяемости классы, которые необходимо использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 13:58 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Библиотека STL подходить для использования списков,массивов,карт и так далее Поскольку там всё реализовано на шаблонах, то доступен её исходный текст, где можно разоабраться как что происходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 14:15 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Полагаю, что поступил несколько глупо, т.к. коряво упростил схему классов, решив, что так легче будет объяснить. В результате вызвал ненужный спор и недразумения, да и сам запутался, чего конечно не хотел. Поэтому помещу в новой теме все "как есть". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:10 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Да все здесь понятно. Надо использовать виртуальные деструкторы. Если это не возможно, то явное приведение типа. Сравни 2 кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:16 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
AkhДа все здесь понятно. Надо использовать виртуальные деструкторы. Если это не возможно, то явное приведение типа. Т.е. если у объекта деструктор виртуальный, то delete удаляет объект на который указывает указатель, а если нет, то объект, тип которого задан при объявлении указателя? Т.е. размер удаляемого объекта в delete зависит от виртуальности деструктора? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:31 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:32 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
еще маленький вопрос //в коде есть такое... classA *pCA; pCA = new classA(); ((class_child_A *)pCA )->add( new classB(this, ...) ); //это нормально? ..... ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:53 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Главное - это то что, у тебя в деструкторах обычно высвобождаются захваченные объектом ресурсы (например, память - при помощи new). Надо, чтоб вызвался правильный деструктор, который освободит захваченные ресурсы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:57 |
|
||
|
Проблема с динамическим созданием/удалением объектов
|
|||
|---|---|---|---|
|
#18+
Tubrikеще маленький вопрос //в коде есть такое... classA *pCA; pCA = new classA(); ((class_child_A *)pCA )->add( new classB(this, ...) ); //это нормально? ..... ..... а кто его знает? может у тебя где-нибудь опратор приведения к class_child_A* спрятался. А вообще-то правильнее пользоваться .._cast<> операторами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 20:31 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34042689&tid=2030321]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
381ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 646ms |

| 0 / 0 |
