Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.189.102] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Есть у меня конструктор, правильно было бы, если я бы вызвал
в нем или в методе, который он вызывает, delete this? Да и вообще можно ли вызывать в любом методе delete this? Соответствует ли это общим правилам? |
Сообщ.
#2
,
|
|
|
На сколько я представляю - ничего страшного не будет. Разумеется при delete this вызовется деструктор объекта, поэтому вызывать delete this в деструкторе лучше не надо - я не знаю что сделает компилятор в этом случае, в этом экзотичном случае разные компиляторы могут себя повести по разному - пострадает переносимость программы.
И подумай - нужно ли вообще вызывать деструктор из метода класса, не лучше ли все что нужно поместить в деструктор класса и просто удалять объект по delete oPtr. |
Сообщ.
#3
,
|
|
|
delete this в методе класса - типичная практика. Но вот вызов такого метода из конструктора - это нонсенс. Представь себе, что объект создается на стеке и для него вызывается такой конструктор.
|
Сообщ.
#4
,
|
|
|
Да, а если для объекта на стеке вызовется такой (c delete this) метод, то все будет ок?
|
Сообщ.
#5
,
|
|
|
Нет не будет. Все посыпется. Но! Типичная реализация метода Release для COM-компонентов - if (m_RefCounter == 0) delete this;. Это также справедливо для ситуаций, когда несколько подсистем взаимодействуют между собой посредством интерфейсов. Согласись, в этом случае не будет объектов, распределенных на стеке.
А delete this в конструкторе черевато тем, что new вернет указатель на заведомо освобожденный блок памяти. |
Сообщ.
#6
,
|
|
|
Цитата Flex Ferrum, 09.06.03, 13:22:11 delete this в методе класса - типичная практика. А когда так делают???? Ни разу не видел... :-/ |
Сообщ.
#7
,
|
|
|
Цитата byte, 09.06.03, 20:56:51 А когда так делают???? Ни разу не видел... :-/ Flex_Ferrum же написал - при управлении временем жизни объекта на основании подсчета ссылок |
Сообщ.
#8
,
|
|
|
Цитата byte, 09.06.03, 20:56:51 А когда так делают???? Ни разу не видел... :-/ Немодальный диалог никогда в эмэфцэ не делал? |
Сообщ.
#9
,
|
|
|
Ну, знаешь ли, немодальный диалог можно и без delete this сделать, чем в общем то я и занимаюсь..
|
Сообщ.
#10
,
|
|
|
Цитата e-yes, 10.06.03, 12:44:14 Немодальный диалог никогда в эмэфцэ не делал? Пока нет . А что, там все с ними так запущено? \%) |
Сообщ.
#11
,
|
|
|
Да нет... просто см. соответствующий TechNote. Это в порядке вещей
|
Сообщ.
#12
,
|
|
|
>>delete this в методе класса - типичная практика. Но вот вызов такого метода из >>конструктора - это нонсенс. Представь себе, что объект создается на стеке и для >>него вызывается такой конструктор.
Поподрбней, я непонял почему так нельзя... |
Сообщ.
#13
,
|
|
|
Блин! Как квотинг делать?
|
Сообщ.
#14
,
|
|
|
Цитата Туту, 11.06.03, 09:45:19 >>delete this в методе класса - типичная практика. Но вот вызов такого метода из >>конструктора - это нонсенс. Представь себе, что объект создается на стеке и для >>него вызывается такой конструктор. Поподрбней, я непонял почему так нельзя... потому что обычные (неперегруженные) new и delete работают с кучей, а не со стеком, для стека память не освобождается, а просто перещелкивается стекпоинтер. А квотировать - это по русски означает "цитировать" |
Сообщ.
#15
,
|
|
|
А потому, что при выделении объекта на стеке память ему распределяется не из пула (читай - не вызывается оператор new), и в этом случае вызывать для этого объекта delete - смерти подобно.
|