Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

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

Чем грозит второй вариант?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2009, 21:09     Удаление динамического массива
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FAT
5 / 5 / 0
Регистрация: 03.03.2009
Сообщений: 18
05.03.2009, 21:37     Удаление динамического массива #2
При освобождении памяти из-под массива квадратные скобки обязательны, так как их отсутствие может привести к неопределенному поведению программы. А для освобождения памяти из-под одной переменной квадратные скобки не нужны. Операция delete [] выполняется медленее, чем delete. Это если память была выделена с помощью оператора new, а если память была выделена с помощью malloc, то память освобождают с помощью функции free.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,354
05.03.2009, 21:51     Удаление динамического массива #3
Кроме того, что указал коллега FAT, прими еще во внимание, что для массивов нетривиальных классов delete [] вызывает деструкторы для каждого элемента массива, а delete - только для единственного. Если деструктор элемента отвечает за освобождение памяти, хэндлов или еще каких-то ресурсов, реализуя идиому RAII, последствия нетрудно предвидеть....
Да, и, конечно, delete вместо delete[] (равно как и наоборот) не только может привести к UB, но и - обязательно приведет. Другое дело, что это может проявится даааааалеко не сразу......
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
06.03.2009, 14:02     Удаление динамического массива #4
Вообщем — если ты выделял место под несколько элементов, то используй delete [], иначе используй просто delete.
darkAngel
Технофашист
214 / 195 / 4
Регистрация: 11.03.2009
Сообщений: 860
25.03.2010, 19:36     Удаление динамического массива #5
Народ, помогите, как высвободить память из под многомерного массива:
String ***C = new String**[n];

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

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

В чем может быть дело? Среда VS 2010.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.05.2012, 11:20     Удаление динамического массива #8
Мишико, скорее всего, при работе с этой памятью вы где-то выходите за её границы.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
01.05.2012, 11:54     Удаление динамического массива #9
Цитата Сообщение от voff4igg Посмотреть сообщение
double* x = new double[elCount];
Бондарёв пишет что этот массив надо удалить через delete x;
я могу ошибаться ,но где то я читал что это объясняется тем что компилятор знает размерность массива т е(количество [])
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
01.05.2012, 11:57     Удаление динамического массива #10
Нет, не знает. Для этого и сделали delete []. Была вроде встроенная "фича" в старых борландских компиляторах, но она к стандарту не относится.
grizlik78
Эксперт С++
1904 / 1436 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
01.05.2012, 12:00     Удаление динамического массива #11
Цитата Сообщение от Van111 Посмотреть сообщение
Бондарёв пишет что этот массив надо удалить через delete x;
Он неправ.

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

Цитата Сообщение от Van111 Посмотреть сообщение
компилятор dev c++
Да не компилятор это... В качестве компилятора (стандартного) там достаточно древний gcc.
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;
?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.09.2012, 18:49     Удаление динамического массива #15
dortonyan, второй вариант. Правда, их можно объединить, если внутри внешнего цикла после выполнения внутреннего удалять и саму строку на соответствующей итерации.
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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2012, 20:18     Удаление динамического массива
Еще ссылки по теме:

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

Удаление динамического массива в классе - C++
при удаление динамического массива в классе зависает программа... хотя в инете нашел кучу примеров, где написано точно также.... :cry: ...

Удаление динамического массива структур - C++
Если удалять массив структур как обычно пишут, то при запросе следующей структуры из массива на вывод она отображается. То есть происходит...

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

Удаление динамического массива строк - C++
Здравствуйте! У меня проблема с удалением массива строк.Создал класс с полем - char** str; резервирую память(делаю это в конструкторе) ...


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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.09.2012, 20:18     Удаление динамического массива #17
dortonyan, именно.
Yandex
Объявления
24.09.2012, 20:18     Удаление динамического массива
Ответ Создать тему
Опции темы

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