delete указателя на ссылку?
От: cppguard  
Дата: 19.11.24 09:37
Оценка: :))
Нашёл вот такое. Заголовочный файл лежит там рядом. Ссылка инициализируется разименованием результата вызова "new" в конструкторе, а в деструкторе вызывается "delete" для указателя на ссылку. Что вообще происходит? Это официальная репа компании-разработчика ESP32, популярных китайских SoC с какой-то неведомой китайской же архитектурой.
Re: delete указателя на ссылку?
От: kov_serg Россия  
Дата: 19.11.24 09:40
Оценка: +4
Здравствуйте, cppguard, Вы писали:

C>Нашёл вот такое. Заголовочный файл лежит там рядом. Ссылка инициализируется разименованием результата вызова "new" в конструкторе, а в деструкторе вызывается "delete" для указателя на ссылку. Что вообще происходит? Это официальная репа компании-разработчика ESP32, популярных китайских SoC с какой-то неведомой китайской же архитектурой.


И что вас смущает?
Re[2]: delete указателя на ссылку?
От: cppguard  
Дата: 19.11.24 09:44
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>И что вас смущает?


Как это работает? Допустим, с инициализацией всё в порядке, если не считать утечки памяти. Но как работает delete в данном случае?
Re[3]: delete указателя на ссылку?
От: vsb Казахстан  
Дата: 19.11.24 09:54
Оценка: +3
Здравствуйте, cppguard, Вы писали:

_>>И что вас смущает?


C>Как это работает? Допустим, с инициализацией всё в порядке, если не считать утечки памяти. Но как работает delete в данном случае?


Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены). Эти поля объявлены, как ссылки. Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо. Когда ты пишешь Point &r = *p, ссылке проставляется тот же адрес, что и у p и когда ты потом напишешь delete &r, в delete будет передан тот же адрес, что и был возвращён через new.
Отредактировано 19.11.2024 9:54 vsb . Предыдущая версия .
Re[4]: delete указателя на ссылку?
От: Maniacal Россия  
Дата: 19.11.24 09:59
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо.


Но есть нюансы. После объявления ссылки новый указатель ей уже не присвоить.
Re[5]: delete указателя на ссылку?
От: vsb Казахстан  
Дата: 19.11.24 10:00
Оценка:
Здравствуйте, Maniacal, Вы писали:

vsb>>Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо.


M>Но есть нюансы. После объявления ссылки новый указатель ей уже не присвоить.


Нюансов там много, ей и NULL нельзя присваивать (поэтому, если new вернёт NULL, то это будет UB, тут надо смотреть, как они malloc реализовали), но суть та же.
Re[4]: delete указателя на ссылку?
От: sergii.p  
Дата: 19.11.24 10:22
Оценка: +2
Здравствуйте, vsb, Вы писали:

vsb>Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены).


а всё таки есть

ekf::ekf(int x, int w) : NUMX(x),
    ...
{
    ...
    this->HP = new float[this->NUMX];
    this->Km = new float[this->NUMX];
    ...
}

ekf::~ekf()
{
    ...
    delete this->HP;
    delete this->Km;
}


ну или как минимум UB
Отредактировано 19.11.2024 10:24 sergii.p . Предыдущая версия .
Re[4]: delete указателя на ссылку?
От: cppguard  
Дата: 19.11.24 10:46
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены). Эти поля объявлены, как ссылки. Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо. Когда ты пишешь Point &r = *p, ссылке проставляется тот же адрес, что и у p и когда ты потом напишешь delete &r, в delete будет передан тот же адрес, что и был возвращён через new.


Спасибо, я догадывался, что оно так может работать. Но вот другой вопрос: где в cppreference об этом написано?
Re: delete указателя на ссылку?
От: so5team https://stiffstream.com
Дата: 19.11.24 10:58
Оценка: +2
Здравствуйте, cppguard, Вы писали:

C>а в деструкторе вызывается "delete" для указателя на ссылку.


delete вызывается для указателя на объект, на который ссылается ссылка.

Ссылка -- это не самостоятельная сущность вроде int-а или указателя на int. Это псевдоним. Поэтому когда для ссылки применяется взятие адреса, то это взятие адреса идет для исходного объекта, а не для ссылки (т.к. ссылка не самостоятельная сущность).

ЗЫ. Как вы смело с вашими знаниями C++ беретесь рассуждать о C++.
Re[3]: delete указателя на ссылку?
От: пффф  
Дата: 19.11.24 11:00
Оценка: +1
Здравствуйте, cppguard, Вы писали:

_>>И что вас смущает?


C>Как это работает? Допустим, с инициализацией всё в порядке, если не считать утечки памяти.


О какой утечке ты говоришь?


C>Но как работает delete в данном случае?


Как обычно — получает указатель и освобождает память
Re[5]: delete указателя на ссылку?
От: пффф  
Дата: 19.11.24 11:02
Оценка: +1
Здравствуйте, cppguard, Вы писали:

C>Спасибо, я догадывался, что оно так может работать. Но вот другой вопрос: где в cppreference об этом написано?


Там наверное много чего не написано, но в чем проблема? Что по-твоему не так?
Re[5]: delete указателя на ссылку?
От: пффф  
Дата: 19.11.24 11:03
Оценка: +1
Здравствуйте, sergii.p, Вы писали:

SP>Здравствуйте, vsb, Вы писали:


vsb>>Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены).


SP>а всё таки есть


SP>ну или как минимум UB


Да нет, тут прокатит — просто деструкторы не вызовутся, но для float они пустые
Re[5]: delete указателя на ссылку?
От: andyp  
Дата: 19.11.24 11:08
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>ну или как минимум UB


Для флоатов на практике может тихо прокатить. Но я бы тоже скобочек насыпал, не жалко ж.
Re: delete указателя на ссылку?
От: night beast СССР  
Дата: 19.11.24 11:09
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Нашёл вот такое.


бгг.
    this->HP = new float[this->NUMX];
    delete this->HP;
Re[2]: delete указателя на ссылку?
От: kov_serg Россия  
Дата: 19.11.24 11:22
Оценка: +1
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, cppguard, Вы писали:


C>>Нашёл вот такое.


NB>бгг.

NB>
    this->HP = new float[this->NUMX];
    delete this->HP;

Вообще должно быть delete[] но для float это не критично просто еще одно UB
Re[5]: delete указателя на ссылку?
От: vsb Казахстан  
Дата: 19.11.24 12:34
Оценка:
Здравствуйте, cppguard, Вы писали:

vsb>>Нет там никакой утечки (ну если new исключение не кинет, но в эмбеддед исключения обычно отключены). Эти поля объявлены, как ссылки. Ссылка это одно и то же, что и указатель, просто разыменовывать по умолчанию не надо. Когда ты пишешь Point &r = *p, ссылке проставляется тот же адрес, что и у p и когда ты потом напишешь delete &r, в delete будет передан тот же адрес, что и был возвращён через new.


C>Спасибо, я догадывался, что оно так может работать. Но вот другой вопрос: где в cppreference об этом написано?


Я не знаю. Вот другая ссылка:

https://isocpp.org/wiki/faq/references

Anything you do to i gets done to x, and vice versa. This includes taking the address of it. The values of &i and &x are identical.
Re[4]: delete указателя на ссылку?
От: pilgrim_ Россия  
Дата: 19.11.24 15:31
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Когда ты пишешь Point &r = *p, ссылке проставляется тот же адрес, что и у p и когда ты потом напишешь delete &r, в delete будет передан тот же адрес, что и был возвращён через new.


Если у Point будет перегружен оператор взятия адреса operator&(), то выделенное неверно.
Re[5]: delete указателя на ссылку?
От: Кодт Россия  
Дата: 21.11.24 16:43
Оценка: +2
Здравствуйте, pilgrim_, Вы писали:

_>Если у Point будет перегружен оператор взятия адреса operator&(), то выделенное неверно.


Ой, да пожалуйста!

Point& r = *new Point();
delete std::addressof(r);


https://en.cppreference.com/w/cpp/memory/addressof
Там ещё один случай, когда нельзя просто так взять и разыменовать: с неполными типами.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.