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

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

05.03.2009, 21:09. Показов 117249. Ответов 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
Заблокирован
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
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,890
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
1062 / 983 / 153
Регистрация: 10.08.2015
Сообщений: 5,334
11.09.2025, 01:54
Цитата Сообщение от Наталья8 Посмотреть сообщение
calloc
Ничего не перепутал?
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,890
11.09.2025, 02:10
Хочешь так опиши, если такой принципиальный.

Тоже от того самого интелекту.
Я просто привёл функцию, которая заполняет нулями выделенную память.
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,890
11.09.2025, 02:39
Все учатся по этому самому интелекту.....
Пропали все ваши строгие правила, уважаемые хранители строгих правил.
Этот интелект не особо заботиться об соблюдении плюсового закона.
Так же и С++ 17 + пропал, что то не вижу давно....
А мне легче. Я не такой принципиальный. Я и на сях могу.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6136 / 2830 / 1039
Регистрация: 01.06.2021
Сообщений: 10,324
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
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,890
11.09.2025, 14:12
Ну согласись, сишные функции более гибкие.
Мне больше нравяться.

Добавлено через 5 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
в языке С++ рекомендовано использовать
Не факт, что все рекомендации надо принимать как закон.
Люди бывают разные,
книжки пишут, что бы денег заработать.
И каждый кулик своё болото хвалит.
Почитай рекомендации по C++ CLI...
Там чётко обосновано, почему С++ гавно, а ихняя разработка золото.
(Уборка мусора, выстрелы в ногу, и так далее)
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,890
11.09.2025, 14:26
Наверное здесь есть польза.. Спасибо,
Как нибудь наверное надо почитать.
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,890
11.09.2025, 14:28
Цитата Сообщение от Royal_X Посмотреть сообщение
а также предпочитать контейнеры, а не массивы через указатели.
А зачем лишнее городить, если можно обойтись просто массивом.
(Как выбито на камне... Мне не кажутся контейнеры как выбитые на камне.
Я их изнутри не вижу, и под капотом букоф наверное дохрена.. Не люблю когда много букоф)
Контейнер может быть многофункциональный, это же хорошо....
А зачем мне его многофункциональность? Излишество... Вот этот лишний функционал.
----------, вообще столько последнее время всего рекомендовано. И не рекомендовано.
Своей головой надо думать.
0
 Аватар для Наталья8
518 / 368 / 65
Регистрация: 09.03.2016
Сообщений: 3,890
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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
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