2017-02-21 8 views
0
int main(){ 

int *p=new int[5]; 

//case 1: delete p; 
//case 2: p++;delete[] p; 


return 0; 
} 

Что произойдет, если я пользуюсь случаем 1 и корпусом 2 отдельно?Что произойдет, если мы удалим массив после приращения указателя?

+0

Вероятно, это зависит от того, какой флаг вы используете во время компиляции. – rakwaht

+1

Это неопределенное поведение. Используйте 'delete []' с 'new []' и 'delete' с' new' –

ответ

5

Что будет

Случай 1: Неопределенное поведение.

p не был возвращен по телефону new (но вместо этого на new[]), поэтому delete p; является UB.


Дело 2: Неопределенное поведение.

p+1 не был возвращен по телефону new[], поэтому p++;delete[] p; - UB.

0

Вы можете освободить память, которую вы не выделили. Вы должны вызвать удаление на том же указателю-значение, которое вы получили обратно с помощью нового

+0

№ Это не определено. Это может освободить память, это может сделать что-то еще. –

+0

еще мое второе утверждение верно. просто подумайте о «воле» как о «могуществе», –