2013-07-12 1 views
3

The answer к this question относится к this page, который говорит, что, для того, чтобы delete this; правильно вести себя:Почему вызывается printf («% p», это); после удаления этого; незаконный?

Вы должны быть абсолютно 100% абсолютно уверен, что никто даже не коснется этого сам указатель после удаления этой строки. Другими словами, вы не должны его изучать, сравнивать с другим указателем, сравнивать его с NULL, печатать, отливать, делать с ним что-либо.

Я не понимаю, почему прикасаясь сам указатель вызывает проблемы.
Не мог бы кто-нибудь объяснить это мне?

+0

is 'printf ("% p ", some_pointer); 'даже определено, когда' some_pointer' имеет тип, отличный от 'void * ', и нет никакого перевода? –

+0

@BenVoigt: Хм, если это вас беспокоит, просто притворись, что я написал «this == this» вместо этого. Во всяком случае, это не вопрос. – Mehrdad

+1

@ user93353: Спасибо, что нашли это! [Ответ Стива] (http://stackoverflow.com/a/1866693/541686) отвечает на мой вопрос! – Mehrdad

ответ

4

Это, вероятно, будет работать на большинстве современных аппаратных средств, но это неопределенное поведение. Я считаю, что обоснование (я читаю это где-то в Интернете) состоит в том, что некоторые архитектуры имеют возможности ловушки в своих регистрах указателей, поэтому, если вы загружаете указатель в регистр и указатель указывает на нераспределенную память, архитектура может запускать сигнал.

+0

Это было бы справедливо для _any_ освобожденного указателя тогда (а не просто 'this'), правильно? – DaoWen

+0

Так что факт, что мы говорим «это», не имеет значения? Как и в, если бы я сказал 'delete p; printf ("% p", p); ', тогда та же проблема существовала бы, правильно? – Mehrdad

+0

@ DaoWen Да. Но это зависит от многих вещей. Intel (и я думаю, что Motorola 68000 также) имеет такую ​​возможность; на Intel, однако, это произойдет только в том случае, если ОС выделяет каждый блок в отдельном сегменте (чего не делают), а если 'malloc' и' operator new' переходят в ОС для каждого размещения (никто не делает). –

2

this указателя является немного особенным, потому что его расчет на объект с использованием виртуального наследования требует чтение смещения виртуальных подобъектов через сам объект. (Я бы ожидал, что это будет сделано до звонящего перед входом в функцию-член, но я не знаю, делают ли 100% реальных компиляторов)

+0

Если это так, тогда 'delete this' не должно быть даже законным в этих контекстах, поскольку он указывает на« под-объект » смещение "в пределах фактического выделенного блока, правильно? – DaoWen

+0

@DaoWen: Но аргумент оценивается до 'delete' ... в это время все еще можно выполнить вычисление и найти полный объект для удаления. И, конечно же, в таких случаях используется виртуальный деструктор. –

+1

Не нужно ли 'this' ** ** ** вычислять до ввода функции? Это не похоже на функцию как-то «знает», что указатель относится к подклассу, он ожидает указатель на текущий класс ... – Mehrdad

Смежные вопросы