Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886

А new+delete сильно умный?

02.05.2015, 05:47. Показов 2189. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот, собственно, с виду совсем не сложный вопрос. Касается взаимосвязи new и delete

C++
1
2
3
4
5
int N=new int[10];
N++;
delete(N-1);
//А Знает ли new, что в массиве стало на 1 меньше. 
delete[]N; //если знает ОК, если не знает "Приехали"
Я, конечно, считаю, что не может он знать. Но вдруг я ошибаюсь. Ведь пишут, что new в закрытой от нас области хранит значение, значит, благодаря деструктору, вызываемому delete, существует вероятность, что компилятор понимает, что на показанном мною примере была освобождена только одна ячейка и, следовательно, ему по силам это значение уменьшить на 1 (так как первый delete не для массива, то именно, что на 1).
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2015, 05:47
Ответы с готовыми решениями:

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

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

Чем отличается delete[] от delete?
чем отличается? delete mas от delete mas

28
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
02.05.2015, 11:00  [ТС]
Студворк — интернет-сервис помощи студентам

Не по теме:

Ну я сам их и взял. Просто смущает такой момент)



Добавлено через 1 минуту
У меня есть кусочек стандарта, там описаны new и delete.
Я ужасно знаю англ. Но немного понимаю.
Судя по описанию
new выделяет блок памяти (в контексте имеется ввиду такой блок, чтобы вместить объект в этот блок)
new[] выделяет блоки памяти для таких блоков
соответсвенно
delete[] только для блоков памяти для таких блоков
delete только для блока
_____________
В моем последнем листинге я использую это свойство. VS рушится (свои же стандарты), mingw корректно срабатывает. При этом я (в последнем листинге) ничего не нарушил по стандарту. Я не вышел за пределы массива, но оно очень похоже на UB (тут я снова не знаю UB или нет. По моей логике не должно быть UB)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
02.05.2015, 11:09
Цитата Сообщение от daslex Посмотреть сообщение
Evg, ну у меня же нету new for free && malloc for delet
У тебя есть new-delete, которые друг другу не соответствуют. Т.е. ты вызываешь new, в ответ получаешь указатель. И этот самый указатель ты должен передать в delete, тогда будет всё корректно. Как только в delete ты подаёшь любой другой указатель (т.е. НЕ в точности тот, который получен каким либо вызовом new), то это и есть непарный new-delete, который может привести к ошибке исполнения

Добавлено через 3 минуты
если ты вызываешь new[], а потом несколько раз вызываешь delete - это НЕ корректный код. И тот факт, что на VS падает, отражает именно некорректность кода, а не то, что у VS какие-то особые стандарты

Добавлено через 51 секунду
т.е. парными являются new-delete и new[]-delete[]. И больше никак
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
02.05.2015, 11:15  [ТС]
Evg, Вас бы да в эту тему (когда она зародилась из несерьезного флуда). Было бы интересно почитать. Там как раз спор на эту тему шел. delete
Я был слишком не убедителен в том, что
Цитата Сообщение от Evg Посмотреть сообщение
т.е. парными являются new-delete и new[]-delete[]. И больше никак
и никто ничего там так и не доказал.

Допустимые операции с нулевым указателем
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
02.05.2015, 11:16
Другими словами, в операциях new/delete, new[]/delete[], malloc/free работа с памятью идёт целиковыми кусками (блоками или неважно как там их называть). Т.е. выделил кусок памяти, и при освобождении её можно освободить ровно тем куском, которым ты её выделил, но не по частям. Я так понимаю, тебя именно этот вопрос интересовал
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2015, 11:20
Напишу совсем на пальцах. Естественно, такое объяснение может отличаться от конкретной реализации и полно неточностей.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
 Выделена память для массива из трех объектов типа int.
 Буквами S+N обозначен блок служебной информации.
 
   arr
     |
     V
 |S+N| int | int | int |
 
 Оператор delete[] ожидает указатель на кусок памяти со служебной информацией S+N.
 */
int* arr = new int[3];
 
/*
 Выеделена память для одного объекта типа int со служебной информацией.
   p
   |
   V
 |S| int |
 
 Оператор delete ожидает указатель на кусок памяти со служебной информацией S.
 */
int* p = new int;
 
// Ожидали |S| ... |, получили |S+N| ... | - UB
delete arr;
 
// Ожидали |S| ... |, получили | int | - UB.
delete arr + 1
 
// Ожидали |S+N| ... |, получили |S| ... | - UB
delete[] p;
Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
и никто ничего там так и не доказал.
Тут нечего доказывать, это написано в стандарте.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
02.05.2015, 11:32  [ТС]
Однако ни у кого в mingw Windows такая программа никогда не упадет, где для new[] используют delete без скобок и утечки памяти не будет, вопреки ожиданиям.
Незачем доказывать.

Мой пример упадет безусловно, мой безоговорочно UB. (и первый и последний и все в этой теме).

Добавлено через 59 секунд
такая
C++
1
2
 int *N=new int[10];
    if (N) delete N;
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2015, 11:35
Цитата Сообщение от daslex Посмотреть сообщение
Однако ни у кого в mingw Windows такая программа никогда не упадет, где для new[] используют delete без скобок и утечки памяти не будет, вопреки ожиданиям.
Незачем доказывать.
Мой пример упадет безусловно, мой безоговорочно UB. (и первый и последний и все в этой теме).
Неопределенное поведение на то и называется неопределенным, что может быть каким угодно. Выше я уже писал: не надо диагностировать класс поведения по симптомам. Они могут и будут меняться между разными компиляторами, системами, опциями сборки и т. д.

Падение не есть UB. Непадение тоже не есть UB. UB — это неопределенность, которая может привести к чему угодно.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21286 / 8311 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
02.05.2015, 11:37
Цитата Сообщение от daslex Посмотреть сообщение
Однако ни у кого в mingw Windows такая программа никогда не упадет, где для new[] используют delete без скобок и утечки памяти не будет, вопреки ожиданиям
Это всего лишь особенность реализации. То, что в mingw такой код не падает, говорит о более безответственном поведении разработчиков компилятора mingw (по сравнению с разработчиками VS), а вовсе не о том, что такой код допустимый
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
02.05.2015, 11:56  [ТС]
Ладно, я закрываю эту тему . Я ответ давно уже получил.(UB, глуповатый new и кривой кодинг)/ Осально оффтоп к вопросу отношения не имеет, хотя и спровоцирован мной.
И все разработчики компиляторов безответственны местами. 100% все.

Добавлено через 4 минуты

Не по теме:

0x10, мои примеры именно, что UB. Они могут как работать в mingw, так и ложить программу в этом же mingw.



Добавлено через 2 минуты

Не по теме:

Evg, А вы о какой студии? 2010 точно также. Не утекает, не ложит. Очень безответственные разработчики у нее.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2015, 11:56

Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться
Написать аналог процедуры Delete. Процедурой Delete и функцией Copy не пользоваться. кто сможет? Помогите!!! На Паскале ABC!!!

Есть ли операторы new, new[], delete, delete[]
Есть ли операторы new, new, delete, delete в Си? И, если есть, чем они отличаются? Тихо подозреваю, что их не было, ведь new пораждает...

Очень сильно торможу на математических задачах, даже очень сильно. Какие книги помогут достичь нужного уровня
Читаю Кнута ,,Искуство программирования'' но очень сильно торможу на математических задачах,даже очень сильно.Какие книги помогут достичь...

Я очень сильно запустил свой ПК,посоветуйте что нибудь т.к. очень сильно тормозит
Сильно запустил свой ПК,при включении приходится ждать около часа чтобы не лагал так сильно,при переустановке Windows лагает также

Клавиша delete не работает,а вот shift + delete работает
Ни ничего не могу удалить как обычно клавишей delete работает только при сочетании shift + delete W7 64 bit Добавлено через 2 часа...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный 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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru