Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9

Использование delete вместо delete[] для динамического массива

23.06.2024, 09:36. Показов 2561. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Играюсь с утечками памяти в одномерных/двухмерных массивах. С двухмерными массивами всё ок, память утекает

Так вот, в следующем примере память НЕ УТЕКАЕТ, хотя написано delete, вместо правильного delete[] (Почему в С++ массивы нужно удалять через delete[]):

C++
1
2
3
4
5
6
int main() {
    int *array = new int[10];
    // …
    // delete[] array;
    delete array;
}
Компилятор msvc (?).

В интернете нашлись некоторые подробности такого поведения:
new[] и delete[] обязаны вызвать конструктор и деструктор для каждого элемента массива.

На самом деле на целом ряде платформ в прошлом (старые Винды и VС или какой-то Borland) и сейчас (встраиваемые) можно использовать delete после new[] и ничего не ломалось. В винде GlobalAlloc всегда записывает сколько ему памяти попросили выделить, на "салфетке бургомистра", эту информацию можно узнать и вызов освобождения GlobalFree этого значения не требует. А вон на линхе узнать размер выделенного блока, насколько я знаю, нельзя.

А в других случаях нужно передавать размер, но не массива а блока памяти на уровне ОС и он где-то хранится. В других это другая функция. Это зависит от того, как организован менеджер памяти в ОС. И поэтому стандарт разрешает рабочей части delete и delete[] иметь одну и ту же реализацию "рабочей" части, высвобождающей память, но мешать их - это UB.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.06.2024, 09:36
Ответы с готовыми решениями:

delete динамического массива символов
Простой код вываливается с ошибкой??? #include <iostream.h> #include <string.h> int main() { char * str; str = new char;...

Ошибка delete [] динамического массива
Здравствуйте! Задача - считать числа из файла, не зная их количества. Для этого я создал динамический массив и заполнил его следующим...

Правильное удаление двумерного динамического массива ( нужен ли delete[] array )
В одном из постов форума Увидев код одного из участников форума: Я пришел в замешательство, когда мне сказали, что delete arr после...

23
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
25.06.2024, 16:19
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
я написал бред
Не совсем...
Просто ваше суждение исходит из неверного посыла.

Рассмотрим ещё раз утверждение:
корректное выполнение программы - это частный случай неопределенного поведения
Согласно данному утверждению может показаться, что если программа корректно выполняется, то эта программа является частным случаем неопределенного поведения.
Именно на этот нюанс вы и обратили внимание.

Однако из истинности утверждения: "а - это б", не следует, что "а - это только и только б", никак не следует, что "а не может быть чем то ещё, кроме б, например в"

Слово "только" DrOffset не использовал.
И тем не менее, у вас в голове нафантазировалось соответствующее ограничение.
Такое явление не редкость. В психологии это называется "когнитивным искажением".
В данном случае когнитивное искажение проявилось в том, что вы домыслили несуществующее "только".


В действительности же, высказывание:
корректное выполнение программы - это частный случай неопределенного поведения
Столь же верное, как и высказывание:
корректное выполнение программы - это общий случай определенного поведения
Более того, из фактов, что "a - это б", и "а - это в", никак автоматически не следует, что "б - это в"
В каких то случаях может следовать, а в каких то может и не следовать.



Добавлено через 1 минуту
Цитата Сообщение от Dushevny Посмотреть сообщение
delete[] обходит массив и вызывает delete для каждого элемента
Бред.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
26.06.2024, 01:50
Цитата Сообщение от Dushevny Посмотреть сообщение
Сделайте массив из элементов, которые в конструкторе выделяют память через new и в деструкторе освобождают ее через delete - увидите разницу.
Для того, чтобы "увидеть разницу", не нужно выделять никакую память в конструкторе и освобождать в деструкторе. Достаточно написать любой класс с нетривиальным деструктором, который делает что угодно, чтобы увидеть, что этот деструктор вызывается для каждого элемента массива.

Именно вызывается деструктор для каждого элемента массива, а не "вызывает delete для каждого элемента", как вы странно и неправильно написали.
1
1520 / 535 / 79
Регистрация: 22.09.2023
Сообщений: 1,704
26.06.2024, 12:21
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
как вы странно и неправильно написали
Согласен. Посыпаю голову окурками.

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Достаточно написать любой класс с нетривиальным деструктором, который делает что угодно, чтобы увидеть, что этот деструктор вызывается для каждого элемента массива.
Но сам по себе невызов деструктора "который делает что угодно"не приведет к утечке памяти, а Рыжий Лис хотел увидеть именно ее.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
26.06.2024, 15:35  [ТС]
Цитата Сообщение от Dushevny Посмотреть сообщение
Но сам по себе невызов деструктора "который делает что угодно"не приведет к утечке памяти, а Рыжий Лис хотел увидеть именно ее.
Конечно, это уже выходит за рамки вопроса (в вопросе спрашивалось только про тривиальные типы int итд).

Вот gcc под рукой оказался, отработал как я думал, для первого элемента вызвался деструктор, для других - нет.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct Trixie {
    Trixie() {
        std::cout << "Trixie()" << std::endl;
    }
    
    ~Trixie() {
        std::cout << "~Trixie()" << std::endl;
    }
};
 
int main() {
    Trixie *array = new Trixie[10];
    // …
    // delete[] array;
    delete array;
}
Code
1
2
3
4
5
6
1.cpp:17:12: warning: ‘void operator delete(void*, std::size_t)’ called on pointer returned from a mismatched allocation function [-Wmismatched-new-delete]
   17 |     delete array;
      |            ^~~~~
1.cpp:14:34: note: returned from ‘void* operator new [](std::size_t)’
   14 |     Trixie *array = new Trixie[10];
      |                                  ^
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
Trixie()
Trixie()
Trixie()
Trixie()
Trixie()
Trixie()
Trixie()
Trixie()
Trixie()
Trixie()
~Trixie()
munmap_chunk(): invalid pointer
Aborted
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.06.2024, 15:35

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю, что будет если выделить память в куче и затем не удалить...

ошибка free()/delete/delete []/realloc() при вызове функции
когда я запускаю код ниже, я получаю следующие ошибки памяти: ==191017== Invalid free() / delete / delete / realloc() ==191017== ...

Почему нет разницы между delete и delete[]?
Почему во время заполнения динамического массива и после этого оператора удаления значений delete arr; удаляется весь массив, хотя по идее...

Какая разница между delete и delete[]
Нашел информацию на разных сайтах и всё равно остались вопросы. Я понимаю, что delete используется для удаления одиночных объектов и...

В чем разница между delete и delete[]?
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru