Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
linq
1 / 1 / 0
Регистрация: 05.11.2012
Сообщений: 26
#1

Оператор delete - C++

19.04.2013, 08:01. Просмотров 696. Ответов 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 (C++):

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

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

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

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

оператор delete - C++
#include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;iomanip&gt; using namespace std; int main() { setlocale (LC_ALL,&quot;russian&quot;); ...

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

16
gazlan
3133 / 1909 / 285
Регистрация: 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
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
19.04.2013, 09:19 #3
C++
1
delete[] i
У него не массив.
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
19.04.2013, 12:59 #4
Цитата Сообщение от Герц Посмотреть сообщение
У него не массив.
Вы нас тогда просветите чем отличается
C++
1
2
int i[];
int *i;
0
bgm123
39 / 39 / 16
Регистрация: 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
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 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 / 8
Регистрация: 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
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
19.04.2013, 13:51 #8
Цитата Сообщение от Nixy Посмотреть сообщение
не массив
Это не массив - это указатель.

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

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


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

Не по теме:


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

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

Добавлено через 1 минуту
Nixy, new(N) выделяется память под ОДИН элемент и инициализируется значением N (никаких массивов тут нет, не было и не будет).
new[N] выделяется память под N элементов и инициализируется дефолтным значением.
Вызов delete[] на объект выделенный через new является UB.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 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 / 8
Регистрация: 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
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 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
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
19.04.2013, 14:07 #14
Цитата Сообщение от Nixy Посмотреть сообщение
расшифруйте UB пожалуйста
Undefined Behavior - не определенное поведение.

Цитата Сообщение от Nixy Посмотреть сообщение
а то что с квадратными это массив
да ну?
C++
1
0[i] //ноль это массив, да?
Индексация это всего лишь удобная запись операции *(указатель+смещение)
прошу заметить - указатель, а не массив.
Я могу выделить массив указателей на массив значений, но это не будет двумерным массивом, хотя обращение будет i[0][0]
0
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
19.04.2013, 14:08 #15
Цитата Сообщение от Croessmah Посмотреть сообщение
0[i] //ноль это массив, да?
Кстате класная штука, многие незнаю что это.
0
19.04.2013, 14:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 14:08
Привет! Вот еще темы с ответами:

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

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

Хочу понять когда можно делать оператор delete - C++
совсем новичок, а в книге толком не объясняется, помогите понять суть плиз Вот очень простой код: #include &lt;windows.h&gt; class...

Оператор delete(ошибка) - free(): invalid next size (fast): 0x098f7008 *** - C++
Делаю некое подобие функции itoa: char* c_itoa(int,char*,int):Реализацию сделал так(упрощённый вид):char* c_itoa(int number,char*...


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

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

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