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