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

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

05.03.2009, 21:09. Показов 117526. Ответов 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
Технофашист
228 / 216 / 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,814
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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru