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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.92
KostyaKulakov
Заблокирован
#1

В чем разница между delete и delete[]? - C++

23.08.2012, 18:24. Просмотров 5492. Ответов 18
Метки нет (Все метки)

а можете еще по подробней рассказать про delete,
точнее даже delete[], чем именно отличается delete[] от delete,
т.к. я попробовал выполнить delete после использования new[],
и программа отработала без ошибок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 18:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чем разница между delete и delete[]? (C++):

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

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс "умного" указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? - C++
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc, free, realloc - которые неподдерживают...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? - C++
Я правильно понимаю, что "delete a, b;" эквивалентно "delete a; delete b;" ?

В чем разница между X x; и X x()? - C++
Корректный ли этот ответ?

В чем разница между С и С++ - C++
Возник вопрос в чем жи разница между С и С++ кроме того, что в С++ есть классы а в С их нету ?

18
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2012, 18:30 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
оператор delete[]
3
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6911 / 3188 / 315
Регистрация: 04.12.2011
Сообщений: 8,825
Записей в блоге: 5
23.08.2012, 18:35 #3
int* a=new int[10];//выделил память длиной 10 целых и получил указатель к которому приводится a (связанный с a)
//delete a; - освободил память из-под указателя, 10 целых занято и удалить их уже проблемно! Указатель же удалил...
delete a[]; //освободил память из-под массива полностью.
1
minforlife
Заблокирован
23.08.2012, 20:36 #4
тип *имя_переменной-указатель = new тип (инициализация);
delete имя_переменной-указатель;

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
int *a = new int (5); // выделяем память
/*
или 
int *a;
a = new int(5);
*/
 
int b = 0;
b = *a; // теперь значение перемнной b = 5
 
delete a; // освобождаем выделенную память
Использование с массивами:
тип *имя_массива = new имя_массива[размер];
// в отличие от переменных массив инициализировать нельзя
delete [] имя_массива;
/* в более ранних версиях C++ необходимо было
указывать размер в квадратных скобках при освобождении выделенной памяти,
т.е. delete [размер] имя_массива;
*/

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int *a = new int [10]; //выделяем память для 10-элементного массива a
 
/*
или 
int *a;
a = new int [10];
*/
 
// инициализируем массив
for(register int i = 0; i < 10; i++) a[i] = 0;
 
// выводим значение 5-го элемента массива (равное нулю)
cout << a[4] << endl;
 
delete [] a; // освобождаем выделенную память под массив

P.S. Скачай книгу "Герберт Шилдт. C++ базовый курс. 3-е издание"... И учись наздоровье
2
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
24.08.2012, 01:24 #5
KostyaKulakov, delete явно указывает на удаление указателя, а delete[] явно указывает на удаление массива указателей.
0
minforlife
Заблокирован
24.08.2012, 08:41 #6
Цитата Сообщение от minforlife Посмотреть сообщение
C++
1
// в отличие от переменных массив инициализировать нельзя
Цитата Сообщение от minforlife Посмотреть сообщение
C++
1
2
// инициализируем массив
for(register int i = 0; i < 10; i++) a[i] = 0;
Имею в виду одновременно объявить и инициализировать... Поэтому используем цикл
Хотя можно и не юзать цикл - перегрузить операторы new (в нем и инициализировать массив) и delete
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.08.2012, 08:50 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от minforlife Посмотреть сообщение
инициализировать нельзя
Можно инициализировать нулями
C++
1
int *arr = new int [ 10 ]();
1
minforlife
Заблокирован
24.08.2012, 08:52 #8
Тип может быть и другой... Лучше перегрузить операторы...
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.08.2012, 08:54 #9
Какая разница какой тип, в любом случае это вызывает конструктор по умолчанию. Да и перегрузка операторов тут не при чем.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
27.08.2012, 14:44 #10
4iFF, не так. delete говорит, что по указателю лежит одиночный объект (деструктор нужно вызвать единожды), а delete[] - что по указателю лежит массив объектов, и для каждого необходим вызов деструктора.
1
woodser
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 3
21.10.2014, 16:31 #11
Цитата Сообщение от Toshkarik Посмотреть сообщение
Можно инициализировать нулями
C++
1
int *arr = new int [ 10 ]();
А вот и можно:
C++
1
int *a = new int[4] {1, 2, 3, 4};
Скомпилируйте и убедитесь (Проверял в Dev-C++).
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.10.2014, 16:43 #12
woodser, работает только в C++11.
0
nmcf
5770 / 5081 / 1735
Регистрация: 14.04.2014
Сообщений: 20,793
21.10.2014, 17:30 #13
Что-то так и не объяснили разницу. Что дают скобки, если количества в них всё равно нет?
0
Toshkarik
1148 / 865 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.10.2014, 17:32 #14
nmcf, еще раз читаем пост #10
0
nmcf
5770 / 5081 / 1735
Регистрация: 14.04.2014
Сообщений: 20,793
21.10.2014, 17:49 #15
Я это прочитал, но какой смысл скобок без размера? Если же он скрыто где-то присутствует, то они тем более не нужны.
Пока автор не задал вопрос, я считал, что это просто особенность синтаксиса.

Добавлено через 15 минут
Вот по теме: http://habrahabr.ru/company/abbyy/blog/117208/
Размер массива скрыто присутствует в выделяемом участке памяти. Скобки фактически указывают на то, что он есть и его надо учитывать, а без скобок, что нет.
0
21.10.2014, 17:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2014, 17:49
Привет! Вот еще темы с ответами:

В чем разница между [] и * ? - C++
Думал, что ни в чем, но когда попытался сделать так: (в файле 1) char lc; в файле 2: extern char* lc; Компилятор ругаться не стал,...

В чем разница между malloc и new? - C++
в чем разница? что лучше использовать?

В чем разница между new и malloc()? - C++
Всем доброго дня ! Начал читать книгу Пахомов Б. &quot;C/C++ и MS Visual C++ 2008 для начинающих&quot; До этого прочитал С++ за 21 день. ...

В чем разница между random и randomize? - C++
в чем разница между random и randomize??


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

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

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