#cpp
Допустим есть такой кусок кода (набросал на коленке ради примера). int size = 10 // глобальная переменная int* something(int *array){ int *newarray = new int [size*2]; for(int i = 0;i < size; ++i) newarray[i] = array[i]; size *= 2; return newarray; } Пример не несет никакой смысловой нагрузки. Есть массив размером n (размер глобальная переменная), передаем его в функцию, там массив расширяем и передаем его обратно. Вопрос: В теле программы мы выделяем и удаляем динамический массив, окей. Но в функции же происходит так же выделение памяти под другой динамический массив который заменит собой старый. Что при этом происходит? Память так и остается за старым/новым или трется? Вопрос пришел в голову совершенно случайно.
Ответы
Ответ 1
Память, которая была выделена динамически (ну вы ведь по-любому создали массив array посредством new[], а не адрес массива, созданного на стеке, передали), под старый массив (int* array) останется висеть в куче (т.к. все, что создается динамически остается висеть в куче), пока вы сами её не очистите (delete[] array). Т.е. по факту вы лишь создали вдвое больший массив, который никак не связан со старым: вы просто скопировали значения элементов старого массива в элементы нового, а старый так и останется висеть в памяти, пока вы сами же его не удалите.Ответ 2
Любое выделение памяти в куче (new, malloc()) должно всегда сопровождаться соответствующим её освобождением (delete, free()), иначе произойдёт утечка памяти. Если сделать дважды выделение памяти под массив, и только один раз освободить, то будет утечка памяти. int *x = new int[10]; x = new int[20]; // утечка - мы теряем указатель на область памяти, выделенную ранее delete []x; //освобождаем память, выделенную во второй раз. Память, выделенная изначально недоступна, но так же не освобождена. В delete и free() должен передаваться тот же указатель, который был получен при new или malloc(). Память, выделенная через new или malloc() если не освобождать вручную считается используемой процессом пока тот не завершит свою работу.
Комментариев нет:
Отправить комментарий