delete this
недопустим в деструкторе. Его можно использовать где угодно. Но это редко бывает хорошей идеей. Фреймворк wxWidgets
использует его для своего класса потока. У него есть режим, в котором, когда поток завершает выполнение, он автоматически освобождает системные ресурсы и себя (объект wxThread). Я нашел это очень раздражающим, потому что извне вы не можете знать, действительно ли ссылаться на него или нет - вы больше не можете вызывать такую функцию, как IsValid
, потому что объект не существует. Это похоже на главную проблему delete this
, за исключением того, что его нельзя использовать для нединамических объектов.
Если вы это сделаете, убедитесь, что вы не касаетесь каких-либо данных-членов или больше не вызываете какие-либо функции-члены для объекта, который вы удалили таким образом. Лучше всего сделать это последним оператором в невиртуальной, защищенной или частной функции. Вызов удаления также действителен для виртуальной и / или общедоступной функции, но я бы ограничил видимость метода, выполняющего это.
Об этом есть запись в C ++ FAQ. Стандартная цитата C ++ по моему заявлению выше (3.8p5
):
До того, как время жизни объекта началось, но после того, как было выделено хранилище, которое будет занимать объект, или после того, как время жизни объекта закончилось и до того, как хранилище, которое занимал объект, будет повторно использовано или освобождено, любой указатель, который ссылается на хранилище место, где будет находиться или находился объект, можно использовать, но только ограниченным образом. [...] Если объект будет или относился к типу класса с нетривиальным деструктором, а указатель используется в качестве операнда выражения удаления, программа имеет неопределенное поведение.
Время жизни заканчивается, когда деструктор объекта начинает выполнение. Обратите внимание, что есть исключения из правил, которые идут после этого абзаца для объектов, находящихся в стадии строительства и уничтожения (например, вам разрешен доступ к нестатическим элементам данных), подробно описанным в 12.7
.
person
Johannes Schaub - litb
schedule
15.01.2009