int main(){
int *p=new int[5];
//case 1: delete p;
//case 2: p++;delete[] p;
return 0;
}
Что произойдет, если я пользуюсь случаем 1 и корпусом 2 отдельно?Что произойдет, если мы удалим массив после приращения указателя?
int main(){
int *p=new int[5];
//case 1: delete p;
//case 2: p++;delete[] p;
return 0;
}
Что произойдет, если я пользуюсь случаем 1 и корпусом 2 отдельно?Что произойдет, если мы удалим массив после приращения указателя?
Что будет
Случай 1: Неопределенное поведение.
p
не был возвращен по телефону new
(но вместо этого на new[]
), поэтому delete p;
является UB.
Дело 2: Неопределенное поведение.
p+1
не был возвращен по телефону new[]
, поэтому p++;delete[] p;
- UB.
Вы можете освободить память, которую вы не выделили. Вы должны вызвать удаление на том же указателю-значение, которое вы получили обратно с помощью нового
№ Это не определено. Это может освободить память, это может сделать что-то еще. –
еще мое второе утверждение верно. просто подумайте о «воле» как о «могуществе», –
Вероятно, это зависит от того, какой флаг вы используете во время компиляции. – rakwaht
Это неопределенное поведение. Используйте 'delete []' с 'new []' и 'delete' с' new' –