|
|
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
Прошу поразмышлять над такой проблемой. Есть класс, реализующий очередь в самом общем виде, т.е. подходящий для любых типов элементов, образующих очередь. Также есть, например, класс 'C'-строк, содержащий указатель на строку. Для этого указателя память выделяется динамически в зависимости от длины строки. Проблема такова: в клиентском файле, реализующем работу с очередью из строк, при создании объектов-строк и помещении их в очередь при завершении программы, необходим сначала вызов деструктора для класса строк, а затем уже вызов деструктор для самой очереди. При не соблюдении данной очередности вызовов деструкторов возникает ошибка во время исполнения программы. Как можно решить эту проблемму, не прибегая к наследованию и другим усложнениям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 14:47 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
В чем именно проблема? Есть контейнер (пусть очередь в данном случае, хотя не важно) Вполне естественно, если при уничтожении сначала отработают деструкторы для элементов контейнера, а потом деструктор самого контейнера. Так IMHO и должно работаь. В чем может быть засада? Или я чего-то недопонял в вопросе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 14:57 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
redskinВ чем именно проблема? ? Или я чего-то недопонял в вопросе? Напишу конкретней: int main() { создание объекта очереди; заполнение очереди объектами-строками; } - здесь программа заканчивается; очередь уничтожается, не успев высвободить выделенную память для объектов-строк. Т.е. деструктор для строк не вызывается перед деструктором для очереди. (деструктор объектом не вызовешь!). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 16:05 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
geltr redskinВ чем именно проблема? ? Или я чего-то недопонял в вопросе? Напишу конкретней: int main() { создание объекта очереди; заполнение очереди объектами-строками; } - здесь программа заканчивается; очередь уничтожается, не успев высвободить выделенную память для объектов-строк. Т.е. деструктор для строк не вызывается перед деструктором для очереди. (деструктор объектом не вызовешь!). std::vector< std::string > корректно все делает. Что мешает сделать так же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 16:10 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
Сергей ИльичЧто мешает сделать так же? Просто необходимо написать самому очередь из C-строк без использования "встроенных" классов С++. Т.е. написать класс 'очередь' и класс 'строка', являющийся элементами очереди. Программа работает, но выдает ошибку во время выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 16:19 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 16:21 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
В C нет строк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 16:21 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)В C нет строк Я знаю, поэтому и пишу "C-строки", что означает массив char'ов, завершенный '\0'. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 16:28 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) Если речь идет об указателях на объекты в очереди Слишком сложно. Мне необходима самая простая реализация без шаблонов и без _ptr, потому что я пока их просто не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 16:35 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
что-то вы не то рассказываете! Приведите код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 16:56 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
Ну дык и вызывай delete явно, что мешает ??? А вобче, учи C++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 17:04 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
geltrКак можно решить эту проблемму, не прибегая к наследованию и другим усложнениям. В конце работы пробежать в цикле по всей очереди и освободить память выделеную для каждого из элементов. Все. Кстати, то что называешь "С-строки" обычно называется ASCIIz строки :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 17:55 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
funikovyuriчто-то вы не то рассказываете! Приведите код Так и быть. Привожу код программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 18:32 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
geltr funikovyuriчто-то вы не то рассказываете! Приведите код Так и быть. Привожу код программы. Эээ.... так нельзя. Такой класс строки, который у вас написан, никуда не годится. Я даже не стал смотреть на реализацию очереди, поэтму не скажу точную причину ваших граблей, но помедитируйте вот этим примером: (класс C_string - из вашего исходника) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. Тестовая "нехорошая" функция моя. И не говорите, что у вас никогда такого не случится и что ваш класс все будут использовать "как надо". :-)) p.s. кстати, как раз такую задачку (почему все компилируется, но валится) дают в нашем отделе на собеседовании. Азы С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 18:48 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
p.s. Hint: добавьте в описание класса (из целого примера, который вы прикрепили к сообщению) такую строчку: Код: plaintext 1. 2. Запустите на выполнение и посмотрите на вывод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2005, 19:10 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
p.s. кстати, как раз такую задачку (почему все компилируется, но валится) дают в нашем отделе на собеседовании. Азы С++. А можно не сильно сведущим ответить что не так с этим классом, глюк на лицо, но что не так не пойму ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 06:19 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
Kornjushin А можно не сильно сведущим ответить что не так с этим классом, глюк на лицо, но что не так не пойму Один из членов класса C_string - указатель pstr. На конструкторе выделяется память, на деструкторе освобождается, вроде бы все в порядке. Но для C_string не опеределены ни конструктор копирования, ни оператор присваивания. В этом случае компилятор генерирует их самостоятельно и в них выполняется обычное побитовое копирование один в один. Теперь при попытке присвоить один объект класса C_string другому или передать его по значению в функцию, будет создана абсолютно идентичная копия. Адрес в pstr тоже будет одинаковым. Когда объектам придет время умирать, будет попытка дважды освободить одну и ту же область памяти и привет. Выход: либо нормально реализовать копирующий конструктор и оператор присваивания, либо явно запретить копирование и передачу объектов по значению, поместив объявления этих методов в private и не определяя их. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 08:28 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
Это как-то странно. Если очередь ответствена за удаление своих элементов, то она должна сначала удалить все элементы очереди (стороки) а потом уже себя. По другому и быть не может, если не предпринимать дополнительных усилий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 10:08 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
А показать как это реализовать не затруднит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 10:40 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
KornjushinА показать как это реализовать не затруднит? Явный запрет копирования и передачи по значению: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. При этом сами методы не определяем. Если мы потом где-нибудь попробуем создать копию объекта, то компилер грязно выругается. А можно их перенести таки в public и реализовать, например так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Вообще эта тема обстоятельно разжевана во многих хороших книгах по С++ (Эккель, Майерс и пр.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 11:22 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за активное обсуждение, особенно redskin'у. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 16:15 |
|
||
|
проблемы с последовательностью вызовов десктрукторов
|
|||
|---|---|---|---|
|
#18+
geltrВсем спасибо за активное обсуждение.... добавлю, что на мой взгляд Вам будет интересно почитать Джэфа Элджэра... в этой помойке найдёте электронный вариант... С++ . Библиотека программиста. Автор: Джефф Элджер. 259 стр., РУС, PDF. с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2005, 16:59 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=387&tid=2032599]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 353ms |

| 0 / 0 |
