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

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

05.03.2009, 21:09. Показов 117898. Ответов 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
2 / 2 / 0
Регистрация: 16.08.2020
Сообщений: 25
20.08.2020, 14:22
Студворк — интернет-сервис помощи студентам
Я пробовал создавать примерно аналогичные программы, они никогда не выбивают ошибки, но они при этом удаляют все элементы массива. Например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void print_array(ostream& os, char* mas, int c){  
        for (int i = 0; i < c; ++i)
        os << i << "-"<< mas[i] << endl;}
int main(){
int y=0;
char* ch=new char[y];
cout << "Input:" << endl;
while(cin){
    cin >> ch[y];
    if(ch[y]=='!') break;
    ++y;}
print_array(cout, ch, y);
delete [] ch;
cout << endl << "___________________" << endl;
print_array(cout, ch, y);
 
}
Вывод:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Input some chars:
sadasfda!
0-s
1-a
2-d
3-a
4-s
5-f
6-d
7-a
 
___________________
0-
1-
2-
3-
4-
5-
6-
7-
При чем, вторая удаляет весь массив независимо от использования delete [] xp/delete xp
почему первая сносит только указатель?

Nishen, спасибо, я понимаю, что так лучше, но сейчас просто пытаюсь разобраться, как это все работает
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
20.08.2020, 19:50
Цитата Сообщение от markmarks Посмотреть сообщение
сейчас просто пытаюсь разобраться, как это все работает
Тогда нужно разобраться с этим - https://www.intuit.ru/studies/... 057?page=1 - а не пытаться методом тыка изучить то, что работать не может.

Добавлено через 2 минуты
Или не разбираться, а просто пользоваться тем, что разрешено делать.
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
20.08.2020, 23:16
Цитата Сообщение от markmarks Посмотреть сообщение
int y=0;
char* ch=new char[y];
можно я похлопаю

Добавлено через 20 минут
Цитата Сообщение от markmarks Посмотреть сообщение
Я пробовал создавать примерно аналогичные программы, они никогда не выбивают ошибки
потому что страница памяти 4 КБ, попробуй выделить 10000 элементов, а потом их вывести
1
2 / 2 / 0
Регистрация: 16.08.2020
Сообщений: 25
21.08.2020, 13:23
На счет удаления указателей разобрался: просто char занимает 1 байт, int 4 а указатель 8 поэтому, в остальном все происходит совершенно одинаково.
Цитата Сообщение от AndryS1 Посмотреть сообщение
можно я похлопаю
Размер массива увеличивается с каждой итеррацией цикла добавления в этот массив нового элемента. Это почти работает, я уже понял, что это не лучшее решение
Цитата Сообщение от AndryS1 Посмотреть сообщение
потому что страница памяти 4 КБ, попробуй выделить 10000 элементов, а потом их вывести
Спасибо.
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
21.08.2020, 13:27
Цитата Сообщение от markmarks Посмотреть сообщение
Размер массива увеличивается с каждой итеррацией цикла добавления в этот массив нового элемента. Это работает до тех пор, пока программа не пытается вывести последний элемент массива.
где там увеличение памяти?
вы знаете как оно происходит?
Цитата Сообщение от markmarks Посмотреть сообщение
char* ch=new char[y];
никаким образом не привязывает в будущем значение y к памяти
увеличение памяти можно сделать только одним способом:
1. Выделяем новое кол-во памяти
2. Копируем из старого указателя в новую память
3. Чистим старый указатель, меняем значение указателя на новую память

Добавлено через 36 секунд
Цитата Сообщение от markmarks Посмотреть сообщение
++y;
будет просто увеличивать значение y, по факту вы обращаетесь к не выделенной памяти
1
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
21.08.2020, 13:29
При очищении памяти в вашем коде у меня вообще ошибка (вложение)
Миниатюры
Удаление динамического массива  
1
21.08.2020, 13:32

Не по теме:

Цитата Сообщение от markmarks Посмотреть сообщение
while(cin)
а зачем это? не логичнее написать true или 1?

0
2 / 2 / 0
Регистрация: 16.08.2020
Сообщений: 25
21.08.2020, 13:51
Спасибо большое, у меня сейчас все сложилось в единый пазл наконец. Про выделение памяти знаю не достаточно, как оказалось.
Цитата Сообщение от AndryS1 Посмотреть сообщение
При очищении памяти в вашем коде у меня вообще ошибка (вложение)
Да, все верно, именно в этом моменте.
Цитата Сообщение от AndryS1 Посмотреть сообщение
а зачем это? не логичнее написать true или 1?
я учу по книге Страуссрупа и в аналогичных по назначению участках кода он делает это именно так, возможно, просто для наглядности
0
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
10.09.2025, 17:58
Цитата Сообщение от TRam_ Посмотреть сообщение
При вызове delete[] никакого "затирания" памяти не происходит, просто память передаётся в пользование другой исполняющейся на твоём компе программе (или помечается как "свободная").
Хотел бы уточнить - на многих платформах (по крайней мере, на винде вроде так) если освобождённая память потом снова захватывается этим же процессом (т. е. диспетчер памяти выделил именно те физические адреса какие были раньше) - то она не затирается. Но если её взял какой-то другой процесс - она таки затирается. Это хорошо для безопасности данных. Но такое стирание памяти зависит от платформы, и стандартом не гарантировано. Всё верно?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.09.2025, 18:39
Цитата Сообщение от Geek Geekson Посмотреть сообщение
Но если её взял какой-то другой процесс - она таки затирается.
Откуда такие умозаключения?
Безопасность данных полностью в ответственности программиста.

Если предположить что это так, то при выделении или освобождении памяти, мы бы наблюдали заметные лаги при работе приложения. Потому как системе нужно было очистить эту страницу/ы памяти.
И зачем это делать?

Если говорить об ОС windows?, я нашел несколько функций(хотя и не копал глубкок) при которой выделенная память инициализируется нулями : ExAllocatePool2 и ExAllocatePoolPriorityZero ... .
В остальных случаях память будет получена неинициализированной.
Майкрософт прямо рекомендуют затирать данные самостоятельно.

Всё это функции для драйверов и системы.
Как именно обстоят с менеджером памяти С++ нужно изучать отдельно.
Но я бы сильно удивился если бы кто то тратил ресурсы моей программы на затирание непонятно чего нулями.

А про то что выделенная память после освобождения затирается, слышу вообще впервые.
1
3 / 3 / 0
Регистрация: 12.07.2022
Сообщений: 213
10.09.2025, 19:13
SmallEvil, потому и уточняю. После освобождения конечно никогда само ничего не затирается. Предполагал только что при выделении этой памяти для другого процесса сама система может её чистить, в момент выделения. Уже не помню откуда такое поверье было)
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,097
10.09.2025, 23:53
При очистке, указатель должен стоять на своём месте.....
Если ты его инкреминировал например на десять и забыл поставить на место, будет heap korruption...
Что бы ездить по массиву, нужен ещё один указатель...

Добавлено через 4 минуты
calloc():
Назначение: calloc (непрерывное выделение) выделяет память для массива элементов и инициализирует все байты в выделенном блоке нулем.
Синтаксис: void* calloc(size_t num, size_t size);
Возвращаемое значение: возвращает void*указатель на выделенный блок памяти или возвращает его, NULLесли выделение не удалось.
Инициализация: выделенная память инициализируется нулем.
Пример:
C++
1
2
3
4
5
6
int* arr = (int*)calloc(5, sizeof(int)); // Allocates space for 5 integers, all initialized to 0
if (arr == NULL) {
    // Handle allocation failure
}
// Use arr
free(arr); // Deallocate memory
Выделяет медленно. Заполнение нулями штука не быстрая.
Примерчик взял у интелекта,
но я помню. Я люблю пользовать эту функцию.
0
 Аватар для vlisp
1067 / 988 / 153
Регистрация: 10.08.2015
Сообщений: 5,393
11.09.2025, 01:54
Цитата Сообщение от Наталья8 Посмотреть сообщение
calloc
Ничего не перепутал?
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,097
11.09.2025, 02:10
Хочешь так опиши, если такой принципиальный.

Тоже от того самого интелекту.
Я просто привёл функцию, которая заполняет нулями выделенную память.
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,097
11.09.2025, 02:39
Все учатся по этому самому интелекту.....
Пропали все ваши строгие правила, уважаемые хранители строгих правил.
Этот интелект не особо заботиться об соблюдении плюсового закона.
Так же и С++ 17 + пропал, что то не вижу давно....
А мне легче. Я не такой принципиальный. Я и на сях могу.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6241 / 2954 / 1047
Регистрация: 01.06.2021
Сообщений: 10,979
11.09.2025, 11:29
Наталья8, да, в С++ в <cstdlib> есть calloc, а вернее std::calloc. Есть и std::free и std::realloc.

ОДНАКО, в языке С++ рекомендовано использовать new / delete, а также предпочитать контейнеры, а не массивы через указатели. В С++ по умолчанию нужно писать в стиле С++, и только при объективной необходимости использовать C-style.

C++ Core Guidelines
CPL: C-style programming
CPL.1: Prefer C++ to C
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,097
11.09.2025, 14:12
Ну согласись, сишные функции более гибкие.
Мне больше нравяться.

Добавлено через 5 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
в языке С++ рекомендовано использовать
Не факт, что все рекомендации надо принимать как закон.
Люди бывают разные,
книжки пишут, что бы денег заработать.
И каждый кулик своё болото хвалит.
Почитай рекомендации по C++ CLI...
Там чётко обосновано, почему С++ гавно, а ихняя разработка золото.
(Уборка мусора, выстрелы в ногу, и так далее)
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,097
11.09.2025, 14:26
Наверное здесь есть польза.. Спасибо,
Как нибудь наверное надо почитать.
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,097
11.09.2025, 14:28
Цитата Сообщение от Royal_X Посмотреть сообщение
а также предпочитать контейнеры, а не массивы через указатели.
А зачем лишнее городить, если можно обойтись просто массивом.
(Как выбито на камне... Мне не кажутся контейнеры как выбитые на камне.
Я их изнутри не вижу, и под капотом букоф наверное дохрена.. Не люблю когда много букоф)
Контейнер может быть многофункциональный, это же хорошо....
А зачем мне его многофункциональность? Излишество... Вот этот лишний функционал.
----------, вообще столько последнее время всего рекомендовано. И не рекомендовано.
Своей головой надо думать.
0
 Аватар для Наталья8
622 / 380 / 67
Регистрация: 09.03.2016
Сообщений: 4,097
11.09.2025, 18:27

Ну да... Если эти расширенные тебе необходимы....
А если и суженными обходишься, зачем зря голову морочить...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2025, 18:27
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru