
C/C++
Почему нельзя освободить выделенную память для элемента массива или как это сделать правильно?
Ошибка ntdll not loaded.


только всю выделенную область
Алексей
Почему? Ведь элемент находится в динамической памяти.
Хороший вопрос. Память выделяет система и у нее записан начальный адрес и длина. И возвращаем просто по адресу, что уже достаточно понять сколько надо возвратить.
Можно конечно менять длину... ну, в эти дебри не будем идти.
Тут или вообще ничего не надо освобождать или освобождать уже всё.
Многие вообще ничего не освобождают, если нет утечек из-за множества циклов или рекурсий, потом по выходу система сама всю память получит.
Но это только для учебных задач еще можно допустить, и то препод придирается будет.
Можно конечно менять длину... ну, в эти дебри не будем идти.
Тут или вообще ничего не надо освобождать или освобождать уже всё.
Многие вообще ничего не освобождают, если нет утечек из-за множества циклов или рекурсий, потом по выходу система сама всю память получит.
Но это только для учебных задач еще можно допустить, и то препод придирается будет.
Нельзя, так это не работает
Массив создается и удаляется целиком. Изменить нельзя
Массив создается и удаляется целиком. Изменить нельзя
Алексей
По ходу и увеличить размер во время выполнения нельзя.
В С++ стандартом (new - delete) не предусмотрено освобождения памяти по частям. Можно использовать инструменты Cи (malloc - realloc - free) для перераспределения. Но тогда лучше уж и писать на Cи.
Потому что тебя ошибочное представление о том как выделяется и освобождается память. Отсюда и не понимание логики работы с памятью и как следствие вопросы ставящие в тупик.
Необходимо понимать что ты пишешь не программу для компьютера а приложение к операционной системе.
Если программа для компьютера использует ресурсы этого компьютера в частности оперативную память. То приложение для операционной системы запрашивает ресурсы у операционной системы.
Такие запросы от приложений обрабатывает один из модулей ядра операционной системы который организует виртуальное адресное пространство для каждого процесса.
т. к. адресное пространство виртуальное то диспетчеру памяти необходимо точно знать где реально располагаются данные в памяти (смещение)
По этому при выделении памяти процессу диспетчер памяти создает таблицу со смещениями виртуального адресного пространства в реальное и индексами в этой таблице являются значения/адреса на выделенные блоки памяти.
т. е. у каждого выделенного блока памяти есть свое смещение и запрашивать или освобождать ресурс памяти у системы можно только блоком.
Освобождать можно только ранее запрошенный блок иначе возникнет ошибка как в твоем случае.
Необходимо понимать что ты пишешь не программу для компьютера а приложение к операционной системе.
Если программа для компьютера использует ресурсы этого компьютера в частности оперативную память. То приложение для операционной системы запрашивает ресурсы у операционной системы.
Такие запросы от приложений обрабатывает один из модулей ядра операционной системы который организует виртуальное адресное пространство для каждого процесса.
т. к. адресное пространство виртуальное то диспетчеру памяти необходимо точно знать где реально располагаются данные в памяти (смещение)
По этому при выделении памяти процессу диспетчер памяти создает таблицу со смещениями виртуального адресного пространства в реальное и индексами в этой таблице являются значения/адреса на выделенные блоки памяти.
т. е. у каждого выделенного блока памяти есть свое смещение и запрашивать или освобождать ресурс памяти у системы можно только блоком.
Освобождать можно только ранее запрошенный блок иначе возникнет ошибка как в твоем случае.
Чтобы удалить память только для одного элемента динамического массива, нужно перед уменьшением сдвинуть все элементы массива от конца до места удаления элемента. Потом уменьшить размер выделенной памяти. Для этого есть функция realloc().
Похожие вопросы
- Заменить нулями элементы массива, которые расположены между первым минимальным и последним максимальным элементами масси
- Создать одномерный массив, состоящий из n вещественных элементов. Элементы массива определить при помощи случайных чисел
- В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива
- Вычислить произведение нечетных элементов массива В с++
- Можно ли через функцию memset записать число в элемент массива больше чем 255? (Си)
- Упорядочить элементы массива по возрастанию на языке Си
- Сортировка элементов массива методом Шелла
- Найти произведение элементов массива а, состоящего из 25 целых чисел, кратных 2 на Паскаль
- Как удалить элемент массива в C++
- Поменять местами максимальный и последний отрицатель- ный элементы массива А (40)