int** a=new int*;
**a=5;
delete a;
Это неверно, потому что вы выделяете int*
и не указываете его на int
впоследствии. Доступ к самому int*
через *a
нормальный, но доступ к int
через дополнительный *
- это не нормально. Это Undefined Behavior .
Вам нужно добавить это дополнительное int
, например:
int** a=new int*;
*a = new int; // <-- here
**a = 5; // <-- OK!
delete *a; // <-- and don't forget this!
delete a;
int** a=new int*;
**a=5;
delete[] a;
Та же проблема, что и выше - назначение несуществующему int
через **a
- но хуже, потому что теперь вы также не соответствуете new
и delete[]
. Подробнее Неопределенное поведение . Вы можете использовать delete
только с new
и delete[]
только с new[]
.
int** a=new int*;
**a=5;
int* b=new int;
b=*(a);
delete[] a;
cout<<"*b: "<<*b;
Это всего лишь кульминация плохого поведения. Не только вы:
Но вы также:
пропускаете int
, который вы изначально выделили для b
, чтобы указать на него. Впоследствии вы повторно назначаете b
новое (недействительное) значение int*
, теряя доступ к назначенному вами int
. У вас нет надежды когда-либо использовать действительный оператор delete
, чтобы освободить это int
.
, что еще хуже, вы разыменовываете b
для доступа к int
после delete
'с адресом памяти, хранящимся в int*
, который был назначен b
(и этот int*
был недопустим для разыменования с самого начала).
Этот код просто все виды Неопределенного поведения .