2013-05-08 3 views
0

С 41 этого документа: https://www.securecoding.cert.org/confluence/download/attachments/40402999/04+Dynamic+Memory.pdf?version=1&modificationDate=1267372189000неправомерное Сопряженные функции Пример

Почему удалить ниже неправильно?

ip= static_cast<int*>malloc(sizeof(int)); 
*ip= 12; 
. . . 
delete ip; // wrong! 
+3

Слайд 40 представленной вами презентации действительно не может быть намного яснее. –

+0

Вы забыли круглые скобки вокруг выражения. –

+0

Я думаю, что вопрос OP «почему это уязвимость безопасности», указанная на слайде 40. – Max

ответ

6

Вы должны вызвать free() для освобождения памяти приобретенную с malloc().

Оператор delete предназначен только для new.

Таким образом, либо

ip= static_cast<int*>malloc(sizeof(int)); 
*ip= 12; 
. . . 
free(ip); 

или

ip= new int; 
*ip= 12; 
. . . 
delete ip; 
ip = 0; 

Обратите внимание, что это хорошая идея, чтобы свести на нет удаленный указатель после его выпустили, так что любая попытка неправильно разыменования его в будущем будет гарантировано сбой и сделает ошибку легче найти.

+1

Спасибо за это :) – 2013-05-08 12:20:24

0

malloc должно быть в паре с free, а new должно быть сопряжено с delete. delete сделает некоторые дополнительные вещи, которые free не выполняет (например, вызывает деструкторы), поэтому использование его в свободной памяти, выделенной с помощью malloc, может быть плохим.

Смежные вопросы