Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
linq
1 / 1 / 0
Регистрация: 05.11.2012
Сообщений: 26
#1

Оператор delete

19.04.2013, 08:01. Просмотров 826. Ответов 16
Метки нет (Все метки)

Вчера заметил, но ответа в сети так и не нашел:
C++
1
2
3
4
5
int *i = new int(5);
cout << *i << endl;
delete i;
int p = *i;
cout << p <<  endl;
Выводит: 5 0. Но если использовать, например, массивы - то можно будет скопировать все содержимое после удаления.
Что делает delete? Просто информирует систему о том, что блок памяти больше не используется?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 08:01
Ответы с готовыми решениями:

оператор delete
#include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;iomanip&gt; using namespace...

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

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

Оператор delete[]
Код: #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; #define ...

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

16
gazlan
3139 / 1915 / 311
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
19.04.2013, 09:14 #2
C++
1
2
delete[] i;
i= NULL;
1. Информирует delete() о необходимости удаления массива объектов
2. Предотвращает повторное использование невалидного указателя

Для чувствительнных данных, перед освобождением память "зачищается" 00 или FF.

Точное поведение delete() зависит от используемого менеджера памяти, но в общем случае, он просто добавляет список освобожденных блоков памяти к списку свободных блоков (далее возможны различные схемы дефрагментации).

Освобожденная память, обычно (зависит от загрузки итп) еще долго может быть использована без видимых проблем, порождая тяжелые в поиске и отладке баги.

Типично для начинающих SW-авторов выкладывать DEBUG-версии программ, так как RELEASE-версии не работают, а найти ошибки они не в состоянии - именно из-за проблем управления памятью.
0
Герц
525 / 342 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
19.04.2013, 09:19 #3
C++
1
delete[] i
У него не массив.
1
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
19.04.2013, 12:59 #4
Цитата Сообщение от Герц Посмотреть сообщение
У него не массив.
Вы нас тогда просветите чем отличается
C++
1
2
int i[];
int *i;
0
bgm123
40 / 40 / 27
Регистрация: 29.01.2013
Сообщений: 277
19.04.2013, 13:02 #5
Цитата Сообщение от Nixy Посмотреть сообщение
Вы нас тогда просветите чем отличается
Код C++
1
2
int i[];
int *i;
int i[] - константный указатель, int *i - неконстантный указатель

Добавлено через 1 минуту
C
1
int []
то же самое, что

C
1
int * const p = 0x...
0
Croessmah
++Ͻ
14488 / 8269 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
19.04.2013, 13:49 #6
Цитата Сообщение от Nixy Посмотреть сообщение
Вы нас тогда просветите чем отличается
А Вы не видите, что выделяется один элемент
Цитата Сообщение от linq Посмотреть сообщение
C++
1
int *i = new int(5)
;
а удаляется массив:
Цитата Сообщение от gazlan Посмотреть сообщение
C++
1
delete[] i;
Добавлено через 38 секунд

Не по теме:

Цитата Сообщение от bgm123 Посмотреть сообщение
то же самое, что
Не то же самое.

0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
19.04.2013, 13:50 #7
Цитата Сообщение от bgm123 Посмотреть сообщение
int i[] - константный указатель, int *i - неконстантный указатель

Добавлено через 1 минуту
C
1
int []
то же самое, что

C
1
int * const p = 0x...
cуть не в этом, а в том что по мнению,Герц,
C++
1
int* i;
не массив
0
Croessmah
++Ͻ
14488 / 8269 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
19.04.2013, 13:51 #8
Цитата Сообщение от Nixy Посмотреть сообщение
не массив
Это не массив - это указатель.

Цитата Сообщение от Nixy Посмотреть сообщение
cуть не в этом, а в том что по мнению,Герц,
А Герц указал на то, что удаляется массив при выделении одного элемента
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
19.04.2013, 13:52 #9
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы не видите, что выделяется один элемент

а удаляется массив:


Добавлено через 38 секунд

Не по теме:


Не то же самое.

массив одного элемента тоже массив
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.04.2013, 13:56 #10
Цитата Сообщение от linq Посмотреть сообщение
Выводит: 5 0.
Он может вывести что угодно. Использование указателя после удаления оного есть UB и что будет в итоге зависит от компилятора/фазы луны и пр.

Добавлено через 1 минуту
Nixy, new(N) выделяется память под ОДИН элемент и инициализируется значением N (никаких массивов тут нет, не было и не будет).
new[N] выделяется память под N элементов и инициализируется дефолтным значением.
Вызов delete[] на объект выделенный через new является UB.
1
Croessmah
++Ͻ
14488 / 8269 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
19.04.2013, 13:57 #11
Цитата Сообщение от Nixy Посмотреть сообщение
массив одного элемента тоже массив
вот это массив из одного элемента:
C++
1
int * i = new int [i];
А это выделение одного элемента:
C++
1
int * i = new int(1);
для первого delete [], для второго delete
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
19.04.2013, 14:00 #12
Цитата Сообщение от ForEveR Посмотреть сообщение
Он может вывести что угодно. Использование указателя после удаления оного есть UB и что будет в итоге зависит от компилятора/фазы луны и пр.

Добавлено через 1 минуту
Nixy, new(N) выделяется память под ОДИН элемент и инициализируется значением N (никаких массивов тут нет, не было и не будет).
new[N] выделяется память под N элементов и инициализируется дефолтным значением.
Вызов delete[] на объект выделенный через new является UB.
расшифруйте UB пожалуйста

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
вот это массив из одного элемента:
C++
1
int * i = new int [i];
А это выделение одного элемента:
C++
1
int * i = new int(1);
для первого delete [], для второго delete
у вас опечатка ,но тем не менее, в обоих случаях обратится к значениям этих указателей можно через
C
1
i[0]
а то что с квадратными это массив
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
19.04.2013, 14:06 #13
UB - undefined behaviour - неопределенное поведение

Цитата Сообщение от Nixy Посмотреть сообщение
i[0]
Вы не правы.

C++
1
2
3
4
5
6
class A {
   int a;
 
public:
    int& operator[](int index) { retunr a; }
};
Будет ли это правильным назвать массив?

Это получается лишь из-за того что,
C++
1
i[0] == *(i + 0)
1
Croessmah
++Ͻ
14488 / 8269 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
19.04.2013, 14:07 #14
Цитата Сообщение от Nixy Посмотреть сообщение
расшифруйте UB пожалуйста
Undefined Behavior - не определенное поведение.

Цитата Сообщение от Nixy Посмотреть сообщение
а то что с квадратными это массив
да ну?
C++
1
0[i] //ноль это массив, да?
Индексация это всего лишь удобная запись операции *(указатель+смещение)
прошу заметить - указатель, а не массив.
Я могу выделить массив указателей на массив значений, но это не будет двумерным массивом, хотя обращение будет i[0][0]
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
19.04.2013, 14:08 #15
Цитата Сообщение от Croessmah Посмотреть сообщение
0[i] //ноль это массив, да?
Кстате класная штука, многие незнаю что это.
0
Nixy
ComfyMobile
400 / 281 / 34
Регистрация: 24.07.2012
Сообщений: 916
19.04.2013, 14:09 #16
Цитата Сообщение от Croessmah Посмотреть сообщение
Undefined Behavior - не определенное поведение.


да ну?
C++
1
0[i] //ноль это массив, да?
с довыдами товарища ,stima, соглашусь , а Ваш пример это таже самая запись, только вид другой
0
Croessmah
++Ͻ
14488 / 8269 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
19.04.2013, 14:11 #17
Цитата Сообщение от Nixy Посмотреть сообщение
а Ваш пример это таже самая запись
именно. И указатель может быть на что угодно. И утверждение
Цитата Сообщение от Nixy Посмотреть сообщение
а то что с квадратными это массив
в корне не верно.
1
19.04.2013, 14:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 14:11

Оператор delete в деструкторе
Здравствуйте, нужна помощь, есть класс и функция к которую передается этот...

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

Нужно ли тут вызывать оператор delete
Всем здрасьте. Тут встал вопрос об операторе delete. struct x { //... };...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru