Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

C++ динамическое выделение памяти

#cpp


Здравствуйте, у меня вопрос почему память после оператора delete память так и остается
задействована или я что то не так понимаю:
#include 

using 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



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

Комментариев нет:

Отправить комментарий