0 / 0 / 0
Регистрация: 15.02.2009
Сообщений: 11

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

05.03.2009, 21:09. Показов 117236. Ответов 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
1357 / 856 / 365
Регистрация: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru