Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Оператор delete[]

19.02.2020, 12:46. Показов 3298. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Каким образом оператор delete[] определяет какой участок памяти нужно "удалить"?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2020, 12:46
Ответы с готовыми решениями:

оператор delete
#include <iostream> #include <clocale> #include <iomanip> using namespace std; int main() { setlocale (LC_ALL,"russian"); ...

оператор delete[]
Применение delete (без ) к указателю на массив освобождает только нулевой элемент, а оставшиеся создают утечку памяти, но как объяснить...

Оператор delete
Вчера заметил, но ответа в сети так и не нашел: int *i = new int(5); cout << *i << endl; delete i; int p = *i; cout << p...

17
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
19.02.2020, 12:51
Цитата Сообщение от ReYalp Посмотреть сообщение
Каким образом оператор delete[] определяет какой участок памяти нужно "удалить"?
Ты ж сам ему указатель передаешь.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 12:53  [ТС]
Croessmah, как с указателя понять на какого размера участок памяти он указывает?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
19.02.2020, 12:55
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

Цитата Сообщение от ReYalp Посмотреть сообщение
как с указателя понять на какого размера участок памяти он указывает?
Зачем ему это знать?
Система (или какойто другой уровень, используемый для выделения памяти) вернула адрес выделенной памяти, потом его вернули обратно системе.
Как там ОС будет это расхлебывать - её проблемы.
Также, можно запросить у ОС чуть больше памяти, чем запросил пользователь.
Тогда есть возможность сохранить дополнительную служебную информацию, например, число объектов для которых нужно вызвать деструкторы.
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.02.2020, 12:56
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

ReYalp, зависит от реализации этого самого выделения в компиляторе. Иногда размер пишется в памяти перед местом, с которого начинается собственно выделенный массив.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 12:59  [ТС]
Croessmah, ну ему это нужно знать чтобы освободить столько памяти сколько было выделено, спасибо за ответ
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
19.02.2020, 13:02
Цитата Сообщение от ReYalp Посмотреть сообщение
ну ему это нужно знать
Зачем? Он у кого-то (назовем его менеджером памяти) попросил сколько-то памяти, ему дали указатель на эту память. Когда пришло время, он этот указатель вернул. А уж как там реализован менеджер памяти - delete[] не волнует.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 13:04  [ТС]
Croessmah, а что кстати будет если сместить указатель вправо и пттом вызвать delete[]?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
19.02.2020, 13:06
Цитата Сообщение от ReYalp Посмотреть сообщение
а что кстати будет если сместить указатель вправо и пттом вызвать delete[]?
Неопределенное поведение.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 13:12  [ТС]
DrOffset, а насколько целесообразно использовать размер массива таким способом? Такое на практике используется?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
19.02.2020, 13:13
Цитата Сообщение от ReYalp Посмотреть сообщение
а насколько целесообразно использовать размер массива таким способом?
Добраться снаружи delete[] до размера? Это деталь реализации и с точки зрения C++ - незаконно. Будет иметь место неопределенное поведение.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 13:19  [ТС]
Croessmah, Вы же только что писали что размер delete[] не нужен
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
19.02.2020, 13:23
Цитата Сообщение от ReYalp Посмотреть сообщение
Вы же только что писали что размер delete[] не нужен
Я выше писал, что можно сохранить количество объектов, чтобы знать, сколько объектов нужно уничтожать, т.е. сколько нужно вызвать деструкторов. Если деструкторы вызывать не надо, то и количество объектов хранить не нужно. И да, я писал именно про количество объектов, а не про размер выделенной памяти.
"Массивная" версия delete-expression делегирует освобождение памяти operator delete[] . Тот в свою очередь возлагает это на operator delete. operator delete вполне может быть реализован через C'шный free.

А теперь вопрос. Зачем free знать размер выделенной памяти? malloc может вызвать HeapAlloc(heap, flags, count), а free тогда будет вызывать HeapFree(heap, flags, memptr). Нигде здесь не нужен размер выделенного участка. Хотя реализация вправе сохранять служебную информацию каким-то образом.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 13:23  [ТС]
Croessmah, так а я с самого начала писал о участке памяти, те байтах
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
19.02.2020, 13:29
Цитата Сообщение от ReYalp Посмотреть сообщение
так а я с самого начала писал о участке памяти, те байтах
Так я с самого начала написал, что размер выделенной памяти ему не нужен, тем более, что он может быть не такой, как ему кажется. Но delete[] должен вызвать деструкторы при необходимости, а значит ему нужно где-то держать информацию о количестве объектов. зачастую это реализовывается так, что new[] запрашивает у operator new[] чуть больше памяти и записывает в начало выделенной памяти число созданных объектов, а пользователю возвращается смещенный указатель. delete[] об этом знает. Читает количество объектов, вызывает деструкторы, смещает указатель как нужно и передает его operator delete[]. Опять же, размер выделенного блока ему не нужен.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
19.02.2020, 13:46  [ТС]
Croessmah, зачем тогда сохраняется размер блока для free?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
19.02.2020, 13:50
К слову, имеются версии operator delete[], принимающие размер. И можно переопределить эти функции. Стандартная реализация сводится просто к вызову без размера.
Пробуем переопределить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <new>
#include <string>
 
 
void operator delete[]( void* ptr, std::size_t sz ) noexcept
{
    std::cout << "delete[] " << ptr << " of " << sz << " bytes\n";
    operator delete[](ptr);
}
 
 
int main()
{
    std::cout << "sizeof string: " << sizeof(std::string) << std::endl;
    std::string * p = new std::string[10];
    delete[] p;
}
Смотрим результаты:
оть - https://rextester.com/LLMDM72823
уть- https://rextester.com/QBG57835
опа- https://rextester.com/JIRH96339

Добавлено через 3 минуты
Цитата Сообщение от ReYalp Посмотреть сообщение
зачем тогда сохраняется размер блока для free?
Можно не сохранять, можно сохранять. Кто ж разберет зачем это надо или не надо. Например, можно реализовать собственный менеджер памяти, тогда можно более эффективно использовать ресурсы (если получится, конечно) и не ходить каждый раз к системе на поклон.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2020, 13:50
Помогаю со студенческими работами здесь

Оператор delete
Написал небольшую программу и в просмотрел каждую строчку в отладчике. И получается что сразу же после оператора delete p_val; значение в...

Оператор delete[]
Салют! тут вот в чем вопрос... Если с помощью new выделена память под несколько, скажем, массивов, то с помощью оператор delete удалять...

Оператор delete[]
Код: #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; #define stop __asm nop int main() { int N,M; ...

Оператор delete в деструкторе
Здравствуйте, нужна помощь, есть класс и функция к которую передается этот класс: #include&lt;iostream&gt; using namespace std; ...

Можно ли обобщить оператор delete ?
Здравствуйте! Есть некоторый класс в котором есть указатель которому присваивается некоторое значение &quot;из-вне&quot; так сказать, так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru