Нашёл вот такое. Заголовочный файл лежит там рядом. Ссылка инициализируется разименованием результата вызова "new" в конструкторе, а в деструкторе вызывается "delete" для указателя на ссылку. Что вообще происходит? Это официальная репа компании-разработчика ESP32, популярных китайских SoC с какой-то неведомой китайской же архитектурой.
Здравствуйте, cppguard, Вы писали:
C>Нашёл вот такое. Заголовочный файл лежит там рядом. Ссылка инициализируется разименованием результата вызова "new" в конструкторе, а в деструкторе вызывается "delete" для указателя на ссылку. Что вообще происходит? Это официальная репа компании-разработчика ESP32, популярных китайских SoC с какой-то неведомой китайской же архитектурой.
Здравствуйте, cppguard, Вы писали:
_>>И что вас смущает?
C>Как это работает? Допустим, с инициализацией всё в порядке, если не считать утечки памяти. Но как работает delete в данном случае?
Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены). Эти поля объявлены, как ссылки. Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо. Когда ты пишешь Point &r = *p, ссылке проставляется тот же адрес, что и у p и когда ты потом напишешь delete &r, в delete будет передан тот же адрес, что и был возвращён через new.
Здравствуйте, Maniacal, Вы писали:
vsb>>Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо.
M>Но есть нюансы. После объявления ссылки новый указатель ей уже не присвоить.
Нюансов там много, ей и NULL нельзя присваивать (поэтому, если new вернёт NULL, то это будет UB, тут надо смотреть, как они malloc реализовали), но суть та же.
Здравствуйте, vsb, Вы писали:
vsb>Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены). Эти поля объявлены, как ссылки. Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо. Когда ты пишешь Point &r = *p, ссылке проставляется тот же адрес, что и у p и когда ты потом напишешь delete &r, в delete будет передан тот же адрес, что и был возвращён через new.
Спасибо, я догадывался, что оно так может работать. Но вот другой вопрос: где в cppreference об этом написано?
Здравствуйте, cppguard, Вы писали:
C>а в деструкторе вызывается "delete" для указателя на ссылку.
delete вызывается для указателя на объект, на который ссылается ссылка.
Ссылка -- это не самостоятельная сущность вроде int-а или указателя на int. Это псевдоним. Поэтому когда для ссылки применяется взятие адреса, то это взятие адреса идет для исходного объекта, а не для ссылки (т.к. ссылка не самостоятельная сущность).
ЗЫ. Как вы смело с вашими знаниями C++ беретесь рассуждать о C++.
Здравствуйте, sergii.p, Вы писали:
SP>Здравствуйте, vsb, Вы писали:
vsb>>Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены).
SP>а всё таки есть
SP>ну или как минимум UB
Да нет, тут прокатит — просто деструкторы не вызовутся, но для float они пустые
Здравствуйте, cppguard, Вы писали:
vsb>>Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены). Эти поля объявлены, как ссылки. Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо. Когда ты пишешь Point &r = *p, ссылке проставляется тот же адрес, что и у p и когда ты потом напишешь delete &r, в delete будет передан тот же адрес, что и был возвращён через new.
C>Спасибо, я догадывался, что оно так может работать. Но вот другой вопрос: где в cppreference об этом написано?
Здравствуйте, vsb, Вы писали:
vsb>Когда ты пишешь Point &r = *p, ссылке проставляется тот же адрес, что и у p и когда ты потом напишешь delete &r, в delete будет передан тот же адрес, что и был возвращён через new.
Если у Point будет перегружен оператор взятия адреса operator&(), то выделенное неверно.