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

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

05.03.2009, 21:09. Показов 118125. Ответов 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
Сообщений: 216
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
Сообщений: 216
10.09.2025, 19:13
SmallEvil, потому и уточняю. После освобождения конечно никогда само ничего не затирается. Предполагал только что при выделении этой памяти для другого процесса сама система может её чистить, в момент выделения. Уже не помню откуда такое поверье было)
0
Заблокирован
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
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,403
11.09.2025, 01:54
Цитата Сообщение от Наталья8 Посмотреть сообщение
calloc
Ничего не перепутал?
0
Заблокирован
11.09.2025, 02:10
Хочешь так опиши, если такой принципиальный.

Тоже от того самого интелекту.
Я просто привёл функцию, которая заполняет нулями выделенную память.
0
Заблокирован
11.09.2025, 02:39
Все учатся по этому самому интелекту.....
Пропали все ваши строгие правила, уважаемые хранители строгих правил.
Этот интелект не особо заботиться об соблюдении плюсового закона.
Так же и С++ 17 + пропал, что то не вижу давно....
А мне легче. Я не такой принципиальный. Я и на сях могу.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6278 / 3002 / 1051
Регистрация: 01.06.2021
Сообщений: 11,232
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
Заблокирован
11.09.2025, 14:12
Ну согласись, сишные функции более гибкие.
Мне больше нравяться.

Добавлено через 5 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
в языке С++ рекомендовано использовать
Не факт, что все рекомендации надо принимать как закон.
Люди бывают разные,
книжки пишут, что бы денег заработать.
И каждый кулик своё болото хвалит.
Почитай рекомендации по C++ CLI...
Там чётко обосновано, почему С++ гавно, а ихняя разработка золото.
(Уборка мусора, выстрелы в ногу, и так далее)
0
Заблокирован
11.09.2025, 14:26
Наверное здесь есть польза.. Спасибо,
Как нибудь наверное надо почитать.
0
Заблокирован
11.09.2025, 14:28
Цитата Сообщение от Royal_X Посмотреть сообщение
а также предпочитать контейнеры, а не массивы через указатели.
А зачем лишнее городить, если можно обойтись просто массивом.
(Как выбито на камне... Мне не кажутся контейнеры как выбитые на камне.
Я их изнутри не вижу, и под капотом букоф наверное дохрена.. Не люблю когда много букоф)
Контейнер может быть многофункциональный, это же хорошо....
А зачем мне его многофункциональность? Излишество... Вот этот лишний функционал.
----------, вообще столько последнее время всего рекомендовано. И не рекомендовано.
Своей головой надо думать.
0
Заблокирован
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
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru