|
|
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
Класс : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. TClass1 наследник TObject , на конструкторе TClass1 произходит ecxeption, после вызывается десируктор ... Вопрос: Если я создам обьект класса TClass1 (TClass1 *Class1 = new TClass1 ) Class1 - все равно будет хранить какую-то ссылку, не смотря на то что десируктор уже отработал (delete this). Как понять , что Class1 уже уничтожен, ведь он хранит ссылку ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 14:26 |
|
||
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
Местный писательКласс : TClass1 наследник TObject , на конструкторе TClass1 произходит ecxeption, после вызывается десируктор ... Вопрос: Если я создам обьект класса TClass1 (TClass1 *Class1 = new TClass1 ) Class1 - все равно будет хранить какую-то ссылку, не смотря на то что десируктор уже отработал (delete this). Не будет он хранить ссылку. До операции присваивания дело не дойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 14:49 |
|
||
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 14:53 |
|
||
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
MasterZiv Не будет он хранить ссылку. До операции присваивания дело не дойдет. Понял ! У меня TClass1 *Class1 обьявлен как глобальный (extern PACKAGE TSendOutLookMsg *SendOutLookMsg;) вот и хранится там ссылка ... не надо его обьявлять как глобальный . Спасиб ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 14:57 |
|
||
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
Кстати, если ты хотел этот exception, который выбрасывается здесь : try { throw Exception("!!!"); } поймать здесь : catch (Exception *E) { delete this; } , то так ты его не поймаешь . Кстати - 2 : Этого вообще делать не нужно, поскольку в случае возникновения исключения в конструкторе язык (С++) сам обеспечивает и вызовы деструкторов, и удаление памяти. Самое главное, (кстати-3) что ты НЕ МОЖЕШЬ сказать delete this; в конструкторе, во-первых, поскольку ты не знаешь, как объект this создан, а во-вторых, что в данном случае более важно, объект this еще не сконструирован доконца . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 15:04 |
|
||
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
MasterZivКстати, если ты хотел этот exception, который выбрасывается здесь : try { throw Exception("!!!"); } поймать здесь : catch (Exception *E) { delete this; } , то так ты его не поймаешь . Кстати - 2 : Этого вообще делать не нужно, поскольку в случае возникновения исключения в конструкторе язык (С++) сам обеспечивает и вызовы деструкторов, и удаление памяти. Самое главное, (кстати-3) что ты НЕ МОЖЕШЬ сказать delete this; в конструкторе, во-первых, поскольку ты не знаешь, как объект this создан, а во-вторых, что в данном случае более важно, объект this еще не сконструирован доконца . 1 - ое кстати - проверял ловит ! 2 - ое ктати - без try .. catch() - прозходит что-то не очень понятное, диструктор не вызывается, а программа просто вылетает 3 - е кстати - можно ли вызвать delete this на виртуальном методе AfterConstruction ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 15:14 |
|
||
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
MasterZiv Не будет он хранить ссылку. До операции присваивания дело не дойдет. Сейчас проверил , до присвоения дело дошло !!! Видимо придется проверять валидность ссылки ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2005, 15:31 |
|
||
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
Это какай же у тебя компилятор ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.05.2005, 23:35 |
|
||
|
Кнструктор и деструктор throw Exception
|
|||
|---|---|---|---|
|
#18+
1) если исключение возникло в теле контруктора, то деструктор объекта не будет вызван, потому что класс не создан, но будут вызваны деструкторы членов класса и предтков, которые успели собраться. Далее если исключение возникло при инициализации членов класса или предков - то до тела конструктора дело не дойдет и не дойдет дело и до вашего try catch, поэтому кстати был добавлен в стандарт try catch на конструктор ВЕСЬ, но его кажись уже никто и не поддерживает. Это какой-то жуткий "муветон". 2) this в теле конструктора имхо ИНОГДА можно использовать, его нельзя использовать в списке инициализации. В часности когда необходимо разрешить конфликт имен. Там просто много НО они описаны в Стандарте 12.6.2 - там все про конструкторы и списки инициализации. В частности для const объектов использование this будет неопределено. Но если уж вспоминать Стандарт то он дпускает использование this для доступа в к членам ДАЖЕ в СПИСКЕ ИНИЦИАЛИЗАЦИИ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. и далее черным по белому написано because the mem-initializer are evaluated in the scope of constructor, the this pointer can be used in the expression-list of a mem-initializer to refer to the object being initilized. (12.6.2.8) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2005, 10:38 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33033548&tid=2033374]: |
0ms |
get settings: |
10ms |
get forum list: |
23ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 362ms |

| 0 / 0 |
