1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
1

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

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

Author24 — интернет-сервис помощи студентам
Вот, собственно, с виду совсем не сложный вопрос. Касается взаимосвязи 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2015, 05:47
Ответы с готовыми решениями:

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

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

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

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

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

Не по теме:

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



Добавлено через 1 минуту
У меня есть кусочек стандарта, там описаны new и delete.
Я ужасно знаю англ. Но немного понимаю.
Судя по описанию
new выделяет блок памяти (в контексте имеется ввиду такой блок, чтобы вместить объект в этот блок)
new[] выделяет блоки памяти для таких блоков
соответсвенно
delete[] только для блоков памяти для таких блоков
delete только для блока
_____________
В моем последнем листинге я использую это свойство. VS рушится (свои же стандарты), mingw корректно срабатывает. При этом я (в последнем листинге) ничего не нарушил по стандарту. Я не вышел за пределы массива, но оно очень похоже на UB (тут я снова не знаю UB или нет. По моей логике не должно быть UB)
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.05.2015, 11:09 22
Цитата Сообщение от 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,882
02.05.2015, 11:15  [ТС] 23
Evg, Вас бы да в эту тему (когда она зародилась из несерьезного флуда). Было бы интересно почитать. Там как раз спор на эту тему шел. delete
Я был слишком не убедителен в том, что
Цитата Сообщение от Evg Посмотреть сообщение
т.е. парными являются new-delete и new[]-delete[]. И больше никак
и никто ничего там так и не доказал.

Допустимые операции с нулевым указателем
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
02.05.2015, 11:16 24
Другими словами, в операциях new/delete, new[]/delete[], malloc/free работа с памятью идёт целиковыми кусками (блоками или неважно как там их называть). Т.е. выделил кусок памяти, и при освобождении её можно освободить ровно тем куском, которым ты её выделил, но не по частям. Я так понимаю, тебя именно этот вопрос интересовал
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.05.2015, 11:20 25
Напишу совсем на пальцах. Естественно, такое объяснение может отличаться от конкретной реализации и полно неточностей.
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,882
02.05.2015, 11:32  [ТС] 26
Однако ни у кого в mingw Windows такая программа никогда не упадет, где для new[] используют delete без скобок и утечки памяти не будет, вопреки ожиданиям.
Незачем доказывать.

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

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

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

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

Не по теме:

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



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

Не по теме:

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

0
02.05.2015, 11:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2015, 11:56
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru