2015-07-08 2 views
0

Предположим, что класс A имеет регулярную функцию-член и функцию виртуального члена, и у меня есть два указателя, указывающих на один и тот же объект A. Предположим, что один ptr удалил объект, а другой указатель не знает об этом. Что произойдет, если другой указатель попытается вызвать регулярную функцию-член и функцию виртуального члена?поведение регулярной функции и виртуальной функции при удалении объекта

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

Спасибо!

+2

Довольно уверен, что это UB – Alejandro

+0

Уже ответил на http://stackoverflow.com/a/11887733/981959 и отличный «гостиничный номер», на который он ссылается. –

+0

Благодарим вас за указание на «гостиничный номер». Мой вопрос на самом деле больше подчеркивает разницу между регулярной функцией и виртуальной функцией. Я понимаю, что не рекомендуется поведение использования указателя после удаления объекта. Но как именно компилятор рассматривает регулярную функцию, виртуальную функцию и даже статическую функцию во время компиляции? Это вопрос, который меня больше интересует. Возможно, я не объяснил это достаточно хорошо в предыдущем посте. В этом аспекте вы можете порекомендовать ответ? Благодаря! – Sarah

ответ

3

Если у вас есть два указателя на один и тот же объект, а у вас есть delete один, то другой остается dangling pointer. Попытка получить доступ к чему-либо после этого является неопределенным поведением.

2

Большинство компиляторов реализуют функции-члены как «обычные» функции с дополнительным параметром указателя, называемым «это».

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

Виртуальные функции реализованы по-разному - vtable должен быть доступен через this до вызова функции (чтобы определить, какой из них вызывать).

Пожалуйста, помните, что эта разница зависит от конкретной реализации - вызов любого метода на удаленном объекте неопределенное поведение и его следует избегать.

+0

Благодарим вас за ответ. Это то, что я искал! Следуйте за своим ответом, если обычная функция не использовала этот указатель, но использует частные переменные-члены, как его поведение тогда? – Sarah

+0

если удаление выполняется в одном потоке и используется в другом потоке, удаление выполняется до доступа, следует ли ожидать такого же поведения? – Sarah

+0

@Sarah: если вы управляете объектами из одного потока и изменяете их (или их указатели и т. Д.) Из другого, вы должны прежде всего ожидать неприятностей :) Но да - неважно, кто или когда удаляет объект - он свисает поведение указателя будет таким же - неопределенным. – Hcorg