|
|
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#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. In try.. In constructor..'(null)' In constructor..'second exception' In destructor..'second exception' In catch..▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌Г In destructor..'▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌Г' если закоменчу удаление строки в конструкторе так: Код: plaintext 1. 2. 3. 4. 5. то: In try.. In constructor..'(null)' In constructor..'second exception' In destructor..'second exception' In catch..second exception In destructor..'second exception' In destructor..'second exception' не пойуму толком что тут вообще происходит, почему вызываются деструкторы раньше времени, почему два конструктора и три деструктора?? почему перехватывается только одно исключение, но программа не вылетает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 11:48:21 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
Первый случай: 1. Производится исключение с созданием объекта в стеке блока try -> constructor 2. В процессе создания объекта вызывается новое исключение. Создание первого объекта не завершено, вызов деструктора производиться не будет. -> constructor 3. Копируется объект в область исключительных ситуаций. 4. Удаляется объект в стеке блока try, удаляя данные. -> destructor 5. Копируется объект в область catch. 6. Выводяться данные в области catch, причем в объекте они уже удалены, поэтому вывод UB 7. Удаляется объект в области catch. Вывод данных тот же. 8. Попытка удаление данных по указателю на удаленные данные. UB - по всей видимости Access Violeishin. На этом работа завершается фатально. Второй случай: данные не удаляются, поэтому во всех трех объектах указатель верен. 9. Удаление объекта из области исключительных ситуаций. 10. Завершение приложения с мусоров в виде не удаленных данных. Почему 3 конструктора и 2 деструктора: первый объект, которому было передано NULL не был создан до конца, и поэтому для него не было вызвано деструктора. Как передать данные при копировании: 1. ввести конструктор копирования, который будет копировать данные. 2. использовать тип данных который может сам копировать данные по своиму указателю, и сам удаляться. Например std::string Как уменьшить количество объектов: получать объект исключения в блок catch по ссылке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 12:18:24 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
спасибо, прояснилось, но авторПочему 3 конструктора и 2 деструктора: первый объект, которому было передано NULL не был создан до конца, и поэтому для него не было вызвано деструктора. наоборот 2 конструктора и 3 деструктора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 12:42:38 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
Tubrik wrote: > наоборот 2 конструктора и 3 деструктора для одного из объектов мог быть вызван оператор присваивания. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 12:48:59 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
Значит получается так: 1. In constructor..'(null)' вызывается исключением из блока try throw(MyExc(NULL)); 2. In constructor..'second exception' вызывается из своего же конструктора. 3. При покидании первого конструктора происходит вызов деструктора In destructor..'second exception' 4. Попадаю в блок catch: In catch..second exception 5. При выходе из блока catch - In destructor..'second exception' 6. Последний вызов деструктора почему-то происходит по завершении main() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 12:56:46 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#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. вывод результатов: In try.. In constructor..'first exception' (1) In constructor..'second exception' (2) In destructor..'second exception' (2) In catch..second exception In destructor..'second exception' (2) In destructor..'second exception' (2) про конструкторы копирования я понял, но не мойму для какого объекта (или его копии) вызывается последний третий конструктор при завершении программы? еще не понимаю куда девается first exception, его же никто не обрабатывает, но программа тем не менее не завершается аварийно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 13:09:48 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
и еще авторКак уменьшить количество объектов: получать объект исключения в блок catch по ссылке. сделал так (правильно, нет - не знаю): throw( &MyExc("second exception") ); ... catch(MyExc *me) результат: In try.. In constructor..'first exception' (1) In constructor..'second exception' (2) In destructor..'second exception' (2) In catch..▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌ т.е. деструктор все для второго исключения вызывается в при выходе из первого конструктора и очищает строку сделал так: throw( MyExc("second exception") ); ... catch(MyExc &me) результат: In try.. In constructor..'first exception' (1) In constructor..'second exception' (2) In destructor..'second exception' (2) In catch..▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌} In destructor..'▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌}' теперь появляется в еще какой-то деструктор. 1-ый деструктор вызывается при выходе из конструктора вызвавшего второе исключение 2-ой при выходе из блока catch (зачем он тут вызывается?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 14:10:04 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
А вы на релизовской версии экспериментируете? дебажная при раскомментированном delete ошибку дает - там повторное удаление. Точнее будет во всех этих конструкторах-деструкторах breakpoint'ов повключать и отладчиком пройтись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 18:05:55 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
МиА вы на релизовской версии экспериментируете? дебажная при раскомментированном delete ошибку дает - там повторное удаление. Точнее будет во всех этих конструкторах-деструкторах breakpoint'ов повключать и отладчиком пройтись про повторное удаление знаю, просто менять лень было, мне инетесно откуда еще один деструтор берется, когда по ссылке передаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 18:09:53 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
Tubrik2-ой при выходе из блока catch (зачем он тут вызывается?) Потому что передаешь объект по значению. Он копируется в стек. Предавай по ссылке. Звиняй, но если опять разгребать конструкторы и деструкторы по новой, можно мозг сломать. Тебе оно надо? Важно помнить следующее: При вызове исключения создается объект в стеке, где он вызывается. Далее он копируется копирующим конструктором (вроде как именно им) в область исключений. Это уже второй объект. Далее разворачивается стек до тех пор, пока исключение не будет перехвачено. В течении этого времени будет убит первый объект. Далее ты перехватываешь исключение. Ты его перехватываешь по значению, следовательно он тебе еще раз копируется (опять же оператором копирования). Ты получешь третий объект. Далее ты выходишь из catch. У тебя убивается 3-й объект. Далее обработка исключения завершена, т.к. ты не вызываешь throw без пераметров. Убивается второй объект. (ну, на счет очередности убийства 2-го и 3-го я мог перепутать). Что мы имеем: Имеем объект носящий информацию о исключении. Имеем его данные. Имеем необходимость эти данные копировать из одного объекта в другой. Что его из этого у нас нет? У нас не копируются данные. Вернее копируются, но конструктором копирования по умолчанию. Какой он? А вот такой: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 18:24:06 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
я уже не удивляюсь, что он уничтожает строку, я ж написал, что все понял про конструктор копирования, я не понял почему при такой передаче, которую я понимаю, как передаче по ссылке: сделал так: Код: plaintext 1. 2. происхоит вызов еще второго деструктора, а при передаче по указателю, которые я сдалал так: Код: plaintext 1. 2. только один деструктор, откуда в первом случае берется второй не понимаю,т.к. предполагаю, что передача по ссылке и указателю в принципе равносильна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2007, 18:36:19 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
Tubrikя уже не удивляюсь, что он уничтожает строку, я ж написал, что все понял про конструктор копирования, я не понял почему при такой передаче, которую я понимаю, как передаче по ссылке: сделал так: Код: plaintext 1. 2. происхоит вызов еще второго деструктора, а при передаче по указателю, которые я сдалал так: Код: plaintext 1. 2. только один деструктор, откуда в первом случае берется второй не понимаю,т.к. предполагаю, что передача по ссылке и указателю в принципе равносильна Надо различать передачу объекта и получения. Во втором случае, ты передаешь ссылку на объект, который сразу же и убьется. Компилятор должен тебе ответить варнингом. Передавать ссылку можно только в том случае, когда ты уверен, что объект не убьется пока не будет обработан catch. Да, по ссылке и указателю получение в данном случае равносильно, но здесь имеет значение предача исключению объекта. Во втором случае она по ссылке, значит тут объект не копируется в область исключений, следовательно получаем на объект меньше, следовательно нет одного деструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 10:02:11 |
|
||
|
помогите понять.. try catch
|
|||
|---|---|---|---|
|
#18+
в принципе, чтоб не парить моск ни себе, ни окружающим, добавляем в класс MyExc копирующий конструктор и оператор присваивания, наполняем их трассировочными выводами на экран и видим полную картину происходящего ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2007, 10:31:48 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=283&tid=2028402]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 359ms |

| 0 / 0 |
