Произойдёт ли утечка памяти?

203
19 декабря 2016, 19:42
int *p1=new int;
int *p2=new int;
p1=p2;

В итоге p1 и p2 будут указывать на один и тот же участок памяти. Произойдёт ли утечка памяти, занятой сначала p1. Если да, то как этого избежать?

Answer 1

Да, утечка произойдет, причем в зависимости от окружающего кода - разная. Как избежать? Способов много. Один из простых - не использовать простые указатели, а использовать умные, которые автоматически занимаются управлением памятью.

Answer 2

Разумеется произойдёт! Ведь будет неизвестен адрес первого выделенного участка (и удалить его не получится...)

и куда страшнее будет если ниже вызывается:

delete p1;
delete p2;

лекарство одно умные указатели 1, умные указатели 2

и ещё new+delete это уже C++ а не C

Answer 3

Собственно, в учебниках по C++, когда автор желает продемонстрировать читателю, что такое "утечка памяти", он часто приводит именно такой код. Даже если логически подумать, то все станет очевидно. Пример без указателей:

int a = 1;
int b = 2;
a=b;  // сможем ли мы теперь иметь дело с первоначальным значением переменной "a" ?

А если в переменной указатель, то то его значение будет утеряно, как единица в данном примере. Следовательно, контроль над значением утерян, как и само значение.

READ ALSO
Как правильно формировать criteria для связи HAS_MANY?

Как правильно формировать criteria для связи HAS_MANY?

Есть модель POSTИ есть модель category_r В последней 3 столбца: id, Post_id, category_id

158
Неправильный расчёт даты возврата книг

Неправильный расчёт даты возврата книг

Я написал код для подсчёта количества дней, через которые должны вернуть книги, взятые в библиотеке, но, к сожалению, код не правильно считает

160
Вопрос по substr_count($_SERVER['REQUEST_URI']

Вопрос по substr_count($_SERVER['REQUEST_URI']

Как показать информацию на нескольких страницах с помощью substr_count($_SERVER['REQUEST_URI']?

230
Как давно был опубликован комментарий

Как давно был опубликован комментарий

Нужно сделать вывод даты комментариев так:

151