так, как я могу освободить выделенную память так, как я это реализовал?
Вы просто не можете, и вы создали утечку памяти.
Объяснение:
Когда вы пишете:
int a = *(new int(5)); // Really bad
Вы в основном:
- выделяете
int
накуча - разыменовывает значение r
- назначает его (копирует) переменной в стеке
Ни разу вы не заботились о сохранении возвращаемого указателяnew
заявления. a
- это другой int
, то есть копия того, что вы выделили в кучу.
Вы не можете удалить a
, потому что этосоздается в стеке. Так как a
является другим объектом, адрес a
отличается от с адресом int
, который вы выделили в куче с помощью new
.
Таким образом, удаление &a
очевидно запрещено Неопределенное поведение и никак не может удалить int
, который вы создали с помощью new
. И так как вы не сохранили возвращенный указатель оператора new
, у вас нет способа его извлечь: это утечка памяти.
Если вы получили ссылку вместо копии, вымог бы удалить его:
int & a = *(new int(5));
delete &a; // fine
Но это слишком сложный, менее эффективный и бессмысленный способ простого выполнения:
int a = 5; // destroyed at scope's end