Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
0 / 0 / 0
Регистрация: 15.02.2009
Сообщений: 11

Удаление динамического массива

05.03.2009, 21:09. Показов 117886. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Имею следующий вопрос:

создаётся массив таким образом:

C++
1
2
int elCount = 10;
    double* x = new double[elCount];
В чем существенная разница между вариантами удаления:
C++
1
delete [] x;
и
C++
1
delete x;
?

Чем грозит второй вариант?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2009, 21:09
Ответы с готовыми решениями:

Удаление динамического массива
есть динамический массив: double** Mas2 = new double*; for(int i=0;i<=kol2;i++) Mas2=new double; Как удалить данный массив...

Удаление динамического массива
Добрый день, уважаемые форумчане! Столкнулся со следующей проблемой, реализовал алгоритм перебора перестановок или размещений с...

Удаление динамического массива
Доброго времени суток! Задача такова, что надо организовать бесконечный ввод в массив. Ввод прекращается после 0. Возникла проблема:...

39
5 / 5 / 1
Регистрация: 03.03.2009
Сообщений: 18
05.03.2009, 21:37
При освобождении памяти из-под массива квадратные скобки обязательны, так как их отсутствие может привести к неопределенному поведению программы. А для освобождения памяти из-под одной переменной квадратные скобки не нужны. Операция delete [] выполняется медленее, чем delete. Это если память была выделена с помощью оператора new, а если память была выделена с помощью malloc, то память освобождают с помощью функции free.
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
05.03.2009, 21:51
Кроме того, что указал коллега FAT, прими еще во внимание, что для массивов нетривиальных классов delete [] вызывает деструкторы для каждого элемента массива, а delete - только для единственного. Если деструктор элемента отвечает за освобождение памяти, хэндлов или еще каких-то ресурсов, реализуя идиому RAII, последствия нетрудно предвидеть....
Да, и, конечно, delete вместо delete[] (равно как и наоборот) не только может привести к UB, но и - обязательно приведет. Другое дело, что это может проявится даааааалеко не сразу......
2
 Аватар для Spo1ler
296 / 56 / 5
Регистрация: 22.05.2008
Сообщений: 788
06.03.2009, 14:02
Вообщем — если ты выделял место под несколько элементов, то используй delete [], иначе используй просто delete.
1
Технофашист
229 / 217 / 11
Регистрация: 11.03.2009
Сообщений: 887
25.03.2010, 19:36
Народ, помогите, как высвободить память из под многомерного массива:
String ***C = new String**[n];

Вот delete[][][] не катит. Как быть?
0
 Аватар для yanyk1n
4342 / 1474 / 680
Регистрация: 12.03.2009
Сообщений: 5,310
25.03.2010, 19:42
darkAngel, для многомерных используется цикл:
C++
1
2
3
4
5
int ** mas = new int * [N];
for (int i=0; i<N; i++) mas[i]=new int [M];
...
for (int i=0; i<N; i++) delete [] mas[i];
delete [] mas;
Добавлено через 38 секунд
Для 3 и более -мерных массивов процедура аналогичная
4
0 / 0 / 0
Регистрация: 26.03.2012
Сообщений: 8
29.04.2012, 18:33
Прочитал кучу информации про массивы и выделение памяти, прочитал кучу тем на этом форуме.
Все равно никак не получается. Код как в топике темы, почти один в один, но при удалении массива через delete [] x возникает такая ошибка:
[img]Загружайте картинки на форум./aa15c6081c21.jpg[/img]



В чем может быть дело? Среда VS 2010.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
01.05.2012, 11:20
Мишико, скорее всего, при работе с этой памятью вы где-то выходите за её границы.
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
01.05.2012, 11:54
Цитата Сообщение от voff4igg Посмотреть сообщение
double* x = new double[elCount];
Бондарёв пишет что этот массив надо удалить через delete x;
я могу ошибаться ,но где то я читал что это объясняется тем что компилятор знает размерность массива т е(количество [])
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
01.05.2012, 11:57
Нет, не знает. Для этого и сделали delete []. Была вроде встроенная "фича" в старых борландских компиляторах, но она к стандарту не относится.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.05.2012, 12:00
Цитата Сообщение от Van111 Посмотреть сообщение
Бондарёв пишет что этот массив надо удалить через delete x;
Он неправ.

Цитата Сообщение от Van111 Посмотреть сообщение
где то я читал что это объясняется тем что компилятор знает размерность массива т е(количество [])
Компилятор может это знать и может корректно удалять массивы, но не обязан это делать, поэтому программист не может на это полагаться.
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
01.05.2012, 12:12
darkAngel,yanyk1n, компилятор dev c++, в данном случае совершенно нормально удалил массив
C++
1
2
3
4
5
6
7
8
9
int main()  {
    int x=30;
    char (*array)[0xff][0xff][0xff]=new char[x][0xff][0xff][0xff];
    system("pause");
    delete array;
    system("pause");
    return 0;
    
}
Добавлено через 40 секунд
можно проверить через диспетчер задач
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
01.05.2012, 12:15
Van111, потому что в массиве лежит скалярный тип. Положите в массив что-то сложнее, объект с деструктором, например, и будете наблюдать UB. Возможно, какие-то компиляторы нормально вызовут деструкторы для всех элементов, но мне представляется менее радужная картина, в которой удалён будет только первый объект в массиве.

Цитата Сообщение от Van111 Посмотреть сообщение
компилятор dev c++
Да не компилятор это... В качестве компилятора (стандартного) там достаточно древний gcc.
1
57 / 1 / 1
Регистрация: 17.08.2012
Сообщений: 31
24.09.2012, 15:38
Цитата Сообщение от yanyk1n Посмотреть сообщение
Для 3 и более -мерных массивов процедура аналогичная
А можно уточнить, как правильно удалять 3-хмерный массив, так:
C++ (Qt)
1
2
3
4
for (i=0; i<M; i++)
for (j=0; j<N; j++)
        delete []mas[i][j];
delete []mas;
или так:
C++ (Qt)
1
2
3
4
5
6
for (i=0; i<M; i++)
for (j=0; j<N; j++)
        delete []mas[i][j];
for (i=0; i<M; i++)
        delete []mas[i];
delete []mas;
?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.09.2012, 18:49
dortonyan, второй вариант. Правда, их можно объединить, если внутри внешнего цикла после выполнения внутреннего удалять и саму строку на соответствующей итерации.
0
57 / 1 / 1
Регистрация: 17.08.2012
Сообщений: 31
24.09.2012, 20:16
Вот так?
C++ (Qt)
1
2
3
4
5
6
7
for (i=0; i<M; i++)
        {
        for (j=0; j<N; j++)
                delete []mas[i][j];
        delete []mas[i];
        }
delete []mas;
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
24.09.2012, 20:18
dortonyan, именно.
1
2 / 2 / 0
Регистрация: 16.08.2020
Сообщений: 25
18.08.2020, 17:26
Еще немного oб удалении массивов. Здесь создается массив, заполняется, выводятся его элементы, затем удаляется
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void print_array(ostream& os, int* mas, int c)
{  
        for (int i = 0; i < c; ++i)
        os << i << "-"<< mas[i] << endl;
}
 
int main()
{
    const int n=10;
    int* x=new int[n];
    for (int i = 0; i < n; ++i)
        x[i]=i+100;
    print_array(cout, x, n);
    delete[] x;
    print_array(cout, x, n);
}
В конце снова происходит попытка его вывести, итоговый результат выглядит так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
0-100
1-101
2-102
3-103
...
...
0-0
1-0
2-102
3-103
...
...
То есть вместо удаления всего массива происходит только удаление указателя, вернее даже, затираются первый 8 байт, равные размеру указателя и двум int. Как удалить весь массив и нужно ли это вообще? Или же массив уже удален, и во втором цикле вывода происходит просто чтение незатертых участков памяти так, как будто там расположены объекты типа int?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.08.2020, 17:42
markmarks, просто в этот раз операционная система не заметила, что обращаешься к чужой памяти. В другой раз заметит и выбьет твоё приложение в ошибку. При вызове delete[] никакого "затирания" памяти не происходит, просто память передаётся в пользование другой исполняющейся на твоём компе программе (или помечается как "свободная").

Добавлено через 1 минуту
А что там будут делать другие программы с этой памятью - зависит от того, "как звёзды встанут".
1
 Аватар для Nishen
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,822
18.08.2020, 21:07
Цитата Сообщение от markmarks Посмотреть сообщение
Здесь создается массив
Советую для динамических массивов в C++ использовать std::vector<>. Не нужно будет заботиться об удалении памяти.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.08.2020, 21:07
Помогаю со студенческими работами здесь

Удаление динамического массива
Привет. Сделал программу с 3 динамическими массивами, но дело в том, что 2 из них, размер которых задается с клавиатуры, удаляются в конце...

Удаление динамического массива
Всем привет!!! Столкнулся со следующей проблемой. В литературе оговоренно, что для удаления всего массива из динамической памяти,...

Удаление динамического массива
Создаю динамический массив целых чисел. Хотелось бы после его создания научиться удалять его, то есть освобождать память. #include...

Удаление динамического массива
доброго времени суток. написал программу, в которой создается динамический массив. с ним проводим определенные операции, а в конце надо его...

Удаление динамического массива
Здравствуйте! Имеем код: #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; using namespace...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru