Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 201, средняя оценка - 4.66
voff4igg
0 / 0 / 0
Регистрация: 15.02.2009
Сообщений: 11
#1

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

05.03.2009, 21:09. Просмотров 31890. Ответов 16
Метки нет (Все метки)

Здравствуйте!

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

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

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

Чем грозит второй вариант?

http://www.cyberforum.ru/cpp-beginners/thread2184955.html

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2009, 21:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удаление динамического массива (C++):

Удаление динамического массива
есть динамический массив: double** Mas2 = new double*; for(int...

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

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

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

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

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

Вот delete[][][] не катит. Как быть?
0
yanyk1n
4331 / 1462 / 680
Регистрация: 12.03.2009
Сообщений: 5,310
25.03.2010, 19:42 #6
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 и более -мерных массивов процедура аналогичная
3
Мишико
0 / 0 / 1
Регистрация: 26.03.2012
Сообщений: 8
29.04.2012, 18:33 #7
Прочитал кучу информации про массивы и выделение памяти, прочитал кучу тем на этом форуме.
Все равно никак не получается. Код как в топике темы, почти один в один, но при удалении массива через delete [] x возникает такая ошибка:
[img]Загружайте картинки на форум./aa15c6081c21.jpg[/img]

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

В чем может быть дело? Среда VS 2010.
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
01.05.2012, 11:20 #8
Мишико, скорее всего, при работе с этой памятью вы где-то выходите за её границы.
0
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,648
Записей в блоге: 12
01.05.2012, 11:54 #9
Цитата Сообщение от voff4igg Посмотреть сообщение
double* x = new double[elCount];
Бондарёв пишет что этот массив надо удалить через delete x;
я могу ошибаться ,но где то я читал что это объясняется тем что компилятор знает размерность массива т е(количество [])
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
01.05.2012, 11:57 #10
Нет, не знает. Для этого и сделали delete []. Была вроде встроенная "фича" в старых борландских компиляторах, но она к стандарту не относится.
0
grizlik78
Эксперт С++
1982 / 1475 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
01.05.2012, 12:00 #11
Цитата Сообщение от Van111 Посмотреть сообщение
Бондарёв пишет что этот массив надо удалить через delete x;
Он неправ.

Цитата Сообщение от Van111 Посмотреть сообщение
где то я читал что это объясняется тем что компилятор знает размерность массива т е(количество [])
Компилятор может это знать и может корректно удалять массивы, но не обязан это делать, поэтому программист не может на это полагаться.
1
Van111
211 / 190 / 22
Регистрация: 03.08.2011
Сообщений: 2,648
Записей в блоге: 12
01.05.2012, 12: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
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
01.05.2012, 12:15 #13
Van111, потому что в массиве лежит скалярный тип. Положите в массив что-то сложнее, объект с деструктором, например, и будете наблюдать UB. Возможно, какие-то компиляторы нормально вызовут деструкторы для всех элементов, но мне представляется менее радужная картина, в которой удалён будет только первый объект в массиве.

Цитата Сообщение от Van111 Посмотреть сообщение
компилятор dev c++
Да не компилятор это... В качестве компилятора (стандартного) там достаточно древний gcc.
1
dortonyan
57 / 1 / 1
Регистрация: 17.08.2012
Сообщений: 31
24.09.2012, 15:38 #14
Цитата Сообщение от 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
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
24.09.2012, 18:49 #15
dortonyan, второй вариант. Правда, их можно объединить, если внутри внешнего цикла после выполнения внутреннего удалять и саму строку на соответствующей итерации.
0
dortonyan
57 / 1 / 1
Регистрация: 17.08.2012
Сообщений: 31
24.09.2012, 20:16 #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
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
24.09.2012, 20:18 #17
dortonyan, именно.
1
24.09.2012, 20:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2012, 20:18
Привет! Вот еще темы с решениями:

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

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

Удаление элеметов динамического массива
Всем привет. Задаю двумерный динамический массив. Необходимо исключить из...

Удаление динамического одномерного массива
Я в шоке оказывается надо еще удалять массив из памяти когда его создаешь....


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

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

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