Когда вы выделяете переменную с новым:
int *a=new int(4);
Эта переменная помещается в кучу, которая содержит всю память, выделенную динамически.Если вместо этого вы объявляете переменную:
int a=4;
a выделяется в стеке, где есть статическая память.Динамическая память может быть освобождена с удалением от пользователя, но статическая память не может.Статическая память автоматически освобождается, когда вы выходите из функции:
void function()
{
int a;
}
Когда функция завершается, автоматически освобождается (за исключением переменных, объявленных с ключевым словом "static").Также переменные в основной функции автоматически освобождаются.Таким образом, вы не можете сказать программе освободить переменную в стеке.В вашем примере число находится в стеке, указатель указывает на число, которое находится в стеке, если вы удаляете его, вы пытаетесь удалить переменную в стеке, что недопустимо, поскольку это не динамическая память.