1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
1 | |
Указатель this, теория23.03.2017, 12:53. Показов 4956. Ответов 80
Метки нет (Все метки)
И все говорят о его константности...
2
|
23.03.2017, 12:53 | |
Ответы с готовыми решениями:
80
Как получить ссылку на указатель или указатель на указатель в массиве? Указатель типа void. Использование косвенного связывания через универсальный указатель Функция, принимающая указатель и число байт и выделяющая память под указатель Функция, получающая указатель на обычную функцию, получает указатель на метод класса |
rikimaru2013
|
23.03.2017, 22:23
Указатель this, теория
#41
|
1
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
23.03.2017, 22:24 [ТС] | 42 |
Константа без квалификатора const.
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
23.03.2017, 22:28 | 43 |
hoggy, а какое ваше мнение, что в VS
T* const this - майкрософ как всегда?
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
|
|
23.03.2017, 22:28 | 44 |
Prvalue - это результаты выражений, которые либо являются временными объектами, либо вообще не ассоциированы ни с какими объектами.
Например, результат выражения 3+2 - prvalue, которое не является временным объектом, а как раз является "просто значением" не ассоциированным ни с какими объектом.
0
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
23.03.2017, 22:30 [ТС] | 45 |
rikimaru2013, это ведь как раз не будет константой времени компиляции. 4 не будет известно на стадии компиляции. Только после.
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
|
||||||
23.03.2017, 22:32 | 46 | |||||
Это откуда такие сведения?
Код
1 0
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
23.03.2017, 22:36 | 47 |
Картинка не моя) А говорим про это http://rextester.com/RAHO66470
Добавлено через 1 минуту скриншоты на 1 странице
0
|
daslex
|
23.03.2017, 22:45
[ТС]
#48
|
Не по теме: rikimaru2013, Да я тут стараюсь добиться точности)
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
|
|
23.03.2017, 23:00 | 49 |
Ну всякие там "всплывающие GUI подсказки" в IDE вообще ничего не значат. Микрософтовский компилятор не считает
this const-квалифицированным.Тут, кстати, важно то, что кроме как в decltype , нигде в С++ невозможно определить на уровне языка, считает ли компилятор указатель this const-квалифицированным или нет. Поэтому если какому-то компилятору захотелось внутренне рассматривать указатель this как const-квалифицированный (чтобы предотвратить попытки модификации например), то он имеет право это делать. Разумеется, не забыв обеспечить правильную функциональность decltype . А когда decltype не было - все вообще было с этим просто.Компиляторы часто содержат внутренние отклонения от стандарта, которые призваны облегчить из реализацию. Пока такие отклонения не приводят к тому, что правильные программы ведут себя неправильно, ничего страшного в этом нет. Все компиляторы этим содержать такие "упрощения".
3
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
||||||
23.03.2017, 23:13 [ТС] | 50 | |||||
Я вернусь к указателю this. В теории, пример, который я напишу ниже, должен быть UB, но учитывая некоторое особое свойство this - неизменяемость+непереназначаемость - этот пример не UB.
Ведь если он UB, то это обозначает, что косвенно изменить указатель this можно. Все признаки UB у примера есть. Если косвенно изменить указатель this можно, то, значит, утверждение, что this не может быть переназначен - неверно.
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
23.03.2017, 23:23 | 51 |
daslex, учитывая, что в теме TheCalligrapher, мне лучше молчать и не вякать с моими 19 мес опыта, но всё же в вашем примере нету UB.
UB в данном коде мог бы быть если шло бы обращение к данным, которые были delete - учитывая, что в print нету обращения к полям - нету UB. Моё мнение)
1
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
23.03.2017, 23:39 [ТС] | 52 |
Я, конечно, подожду ответа специалистов.
Но моё мнение такое, что если память не зарезервирована, то любое выделение памяти может схватить тот самый адрес, где однажды лежал удалённый ныне указатель this, таким образом может произойти несанкционированное переписывание this, что и будет тем самым переназначением, ведь память может выделиться как раз для начала нового объекта, другого объекта, и this в конфузе. Как-то так.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
23.03.2017, 23:42 | 53 |
0
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
23.03.2017, 23:43 [ТС] | 54 |
Да. Наверное не UB.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
23.03.2017, 23:47 | 55 | |||||
формально это - ub.
работа идёт с неконсистентным объектом. однако, сам this при этом не изменился. он по прежнему указывает на уже убитый объект. http://rextester.com/RGH21047
но значение самого указателя при этом не изменяется.
1
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
23.03.2017, 23:51 [ТС] | 56 |
Понял.
0
|
Вездепух
11691 / 6370 / 1723
Регистрация: 18.10.2014
Сообщений: 16,052
|
||||||
23.03.2017, 23:53 | 57 | |||||
Не совсем понимаю, откуда тут взялось предположение об изменении указателя
this . После delete this указатель this становится невалидным. Но это не означает, что его значение поменялось. В этом отношении пример не очень отличается от простого
1
|
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
|
|
23.03.2017, 23:56 [ТС] | 58 |
Утомился.
Я уже разобрался. Добавлено через 2 минуты Почему инвалидным-то? Он такой, какой есть, ему не навредишь. Вас читать немного тяжело, хорошие объяснения, но будто слова глотаются.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
24.03.2017, 00:02 | 59 |
1
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
24.03.2017, 00:29 | 60 |
delete this вообще плохая практика. В большинстве случаев использования, что я встречал - позже кто-нибудь да наступал на грабли.
Но формально, если поменять местами в вашем примере вызов erase (в функции init, ага) и print, то код валиден. Но содержит потенциальную мину замедленного действия. Причём даже обращение к this после удаления может работать как будто всё хорошо. До поры до времени.
1
|
24.03.2017, 00:29 | |
24.03.2017, 00:29 | |
Помогаю со студенческими работами здесь
60
Указатель на функцию, которая принимает в качестве параметра указатель на массив Как правильно удалять выделенную память под указатель на указатель? Зачем нужен указатель на указатель при работе с однонаправленным списком? Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |