|
|
|
наследование, исключения.
|
|||
|---|---|---|---|
|
#18+
вот! наконец то меня поняли :) вообщем, что у меня получилось: 1) объект создается в стэке. Если исключение вызывается внутри try блока, то вызываются деструкторы для всех объектов, которые были полностью созданы, иначе не вызывается ничего. 2) объект создается динамически через new. понятное дело, что никакие деструкторы не вызываются. При вызове delete получаем вызовы деструкторов для всех объектов, которые были полностью созданы + потом segmentation fault (по крайней мере на g++, на других не успел оттестить). Конечно, хотелось бы найти какой-нибудь механизм, который будет понимать, что именно конструирование объекта завершилось неудачей и исходя из этого вызывать некоторый механизм удаления объекта. Кстати, обычный деструктор здесь не всегда может подойти (особенно когда есть виртуальность и в деструкторе используются виртуальные функции - может получиться так, что деструктор сконструированного базового объекта захочет пользоваться функциями наследуемого, который сконструирован не был). Значит, нужен какой-то особый механизм на статическом связывании. Ладно, придумать его меньшая проблема, чем проблема как отследить исключение и запустить этот механизм... мб статикой? (сча попробую подумать в этом направлении) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2007, 17:32 |
|
||
|
наследование, исключения.
|
|||
|---|---|---|---|
|
#18+
StepLg пишет: > 1) объект создается в стэке. > Если исключение вызывается внутри try блока, то вызываются деструкторы > для всех объектов, которые были полностью созданы, иначе не вызывается > ничего. Ага, а если ислючение вызывается в функции, которая вызывается из функции, которая вызывается из функции, которая вызызвается внутри блока try ? И функция эта, самая внутренняя, компилируется отдельно от всех других модулей ? Нет, что-то вы не то говорите. А лучше всего найти что написано в стандарте по этому поводу. > 2) объект создается динамически через new. > понятное дело, что никакие деструкторы не вызываются. .... > Конечно, хотелось бы найти какой-нибудь механизм, который будет > понимать, что именно конструирование объекта завершилось неудачей и > исходя из этого вызывать некоторый механизм удаления объекта. Если при создании объекта через new внутри конструкторов выбросится исключение, то не успеет произойти присваивание адреса нового объекта переменной, которая должна содержать этот адрес. И объект просто потеряется. И даже если ты поймешь, что было выброшено исключение, обработать эту ситуацию невозможно. Потому что нет адреса объекта. Именно поэтому нормальный компилятор, который работает по стандарту, должен корректно вызвать все деструкторы объектов, которые были полностью сконструированы, и после этого освободить память. Это происходит автоматически и ничего для этого делать не надо. Вообще, почитайте Меерса (Effective C++ & More effective C++) на эту тему. Там хорошо все разжевано, и в том числе что надо делать. Кстати, > обычный деструктор здесь не всегда может подойти (особенно когда есть А других нет. Так что и вариантов тоже нет. > виртуальность и в деструкторе используются виртуальные функции - может > получиться так, что деструктор сконструированного базового объекта > захочет пользоваться функциями наследуемого, который сконструирован не > был). Такого не бывает в С++. Значит, нужен какой-то особый механизм на статическом связывании. > Ладно, придумать его меньшая проблема, чем проблема как отследить Не надо ничего придумывать. Надо изучать С++ лучше. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2007, 19:08 |
|
||
|
наследование, исключения.
|
|||
|---|---|---|---|
|
#18+
MasterZiv StepLg пишет: > 1) объект создается в стэке. > Если исключение вызывается внутри try блока, то вызываются деструкторы > для всех объектов, которые были полностью созданы, иначе не вызывается > ничего. Ага, а если ислючение вызывается в функции, которая вызывается из функции, которая вызывается из функции, которая вызызвается внутри блока try ? И функция эта, самая внутренняя, компилируется отдельно от всех других модулей ? Нет, что-то вы не то говорите. А лучше всего найти что написано в стандарте по этому поводу. Неудачная фрмулировка. Деструкторы объектов на стеке вызываются в момент прехвата исключения сгенерированного типа. Стандарт по этому поводу наверняка молчит, поскольку если исключение не перехвачено - программа нештатно завершается, а при нештатном завершении никаких гарантий нет. Да и если поставить себя на место разработчиков - каким образом можно реализовать раскрутку стека. То представь себе самое простое и эффективное - имено такое решение, сначала собрал все объекты которые надо удалить, а уж потом удалять StepLg > 2) объект создается динамически через new. > понятное дело, что никакие деструкторы не вызываются. .... > Конечно, хотелось бы найти какой-нибудь механизм, который будет > понимать, что именно конструирование объекта завершилось неудачей и > исходя из этого вызывать некоторый механизм удаления объекта. Во мечты о сборщике мусора. Ну так найдите себе garbage collector или пишите на java, c#... StepLg > обычный деструктор здесь не всегда может подойти (особенно когда есть > виртуальность и в деструкторе используются виртуальные функции - может > получиться так, что деструктор сконструированного базового объекта > захочет пользоваться функциями наследуемого, который сконструирован не > был). Это невозмжно, как и вызов виртуальной функции в конструкторе, т.к. объект наследник еще не соэдан или уже помер StepLg Значит, нужен какой-то особый механизм на статическом связывании. > Ладно, придумать его меньшая проблема, чем проблема как отследить Не надо ничего придумывать. Надо изучать С++ лучше. И опять мечты о garbage collection Posted via ActualForum NNTP Server 1.4[/quot] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2007, 19:44 |
|
||
|
наследование, исключения.
|
|||
|---|---|---|---|
|
#18+
blinded пишет: > Неудачная фрмулировка. Деструкторы объектов на стеке вызываются в момент > прехвата исключения сгенерированного типа. И в момент выбрасывания. И не только для объектов на стеке. Стандарт по этому поводу > наверняка молчит, поскольку если исключение не перехвачено - программа > нештатно завершается, а при нештатном завершении никаких гарантий нет. Если не перехвачено вообще ? Но это никогда не известно в данном контексте выполнения, будет ли перехвачено ислючение выше. Это невозможно предсказать. Поэтому программа должна работать так, как будто исключение будет перехвачено. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2007, 10:01 |
|
||
|
наследование, исключения.
|
|||
|---|---|---|---|
|
#18+
К сожалению в момент выбрасывания ничего не разрушается пример - см на скрепке А вот вывод из него Код: 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. 56. 57. 58. 59. 60. 61. 62. 63. 64. Ну с объектами в хипе тоже все ясно? развалится если исключение произошло во время его конструированияю Ну вот наша программа сгенерировала исключение которое никто не перехватил? однако она не работает так как если ничего не былою Ежели ничего не было то объект С(10) должен был бы удалитьсяпри выходе из блока (функции foo) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2007, 11:30 |
|
||
|
|

start [/forum/topic.php?fid=57&startmsg=34461246&tid=2029040]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
4ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 401ms |

| 0 / 0 |
