#cpp
Здравствуйте, у меня вопрос почему память после оператора delete память так и остается задействована или я что то не так понимаю: #includeusing namespace std; int main(){ int *p=new int[10]; for(int i=0;i<10;i++){ p[i]=i; } delete [] p;//удаление массива cout< Ответы
Ответ 1
Про то, как надо удалять массивы, Вам уже написали. Напишу про то, почему сохраняется доступ к старым данным. Даже если правильно удалять динамически выделенную память, то не всегда из кучи выгружаются подключенные страницы памяти, особенно если они в середине кучи. Просто они в помечаются как свободные и при повторном запросе на выделение памяти могут быть использованы, если хватает объема. Это ускоряет процесс динамического выделения памяти, которые является довольно ресурсоемким.Ответ 2
Во-первых вы не правильно выполняете удаление массива - надо удалять так delete [] p; Во-вторых, после освобождения памяти, содержимое обычно не очищается, просто участок помечается как свободный. Поэтому там могут некоторое время сохранятся старые значения.Ответ 3
То, что создается с помощью new[], должно удалятся с помощью delete[]. Иначе будут утечки. А то что значение выводится - это компилятор не досмотрел и не дал по пальцам, а вообще то должно было б сгенерироваться исключения доступа к памяти (хотя в релизных вариантах не объязательно). То есть, то что Вы обратились к памяти, которую освободили и там что то вывелось - это просто UB (неопределенное поведение). В приведенном выше примере ничего плохого скорее всего не будет, а вот в какой нибудь нагруженной системе может вывестись совсем другое значение (в лучшем случае).Ответ 4
После завершения программы вся занятая память все равно освободится, так, что на это счет можно особо не париться. А вообще будьте осторожнее, здесь, в вашем коде по нелепой неосторожности может произойти утечка памяти.
Комментариев нет:
Отправить комментарий