Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Создание динамического массива структур и его удаление06.02.2013, 10:06. Показов 24390. Ответов 36
Господа, поясните пожалуйста следующий момент:
создаю структуру:
P.S. И правильно ли удалять такую конструкцию именно delete [], а не просто delete?
0
|
06.02.2013, 10:06 | |
Ответы с готовыми решениями:
36
Удаление динамического массива структур Создание копии динамического массива структур Создание динамического массива структур Преобразование кода в ряд структур, создание динамического массива |
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
08.02.2013, 11:01 [ТС] | 21 |
mimicria, спасибо, что еще раз мне напомнили о занулении указателей.
Хорошо. По теме. Перфразирую: Как именно он освобождает память? И в чем отличие от простого зануления указателя?
0
|
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
|
|
08.02.2013, 11:20 | 22 |
Ваши фразы говорят о том, что вы совсем не понимаете сути выделения и освобождения памяти. new выделила память и вернула действующий указатель. Эта область памяти в куче помечается как занятая. delete по указателю пометил выделенную память как освобождённую. Обнуление указателя делается на случай повторного вызова delete ПОСЛЕ освобождения памяти. Если вы уверены, что указатель точно больше нигде случайно не будет использован, то обнуление указателя можно и не делать.
Приведу простой пример. Вася дал Пете денег в долг. Петя дал Васе долговую расписку. Петя купил жене шубу, а с зарплаты отдал долг Васе. А расписка осталась. Если случайно Вася попробует еще раз стрясти с Пети деньги по этой расписке, то получит в щи. А если Петя предусмотрительно сжёг расписку после отдания долга, то в щи никто уже не получит и претензий никаких. Так доходчиво? Добавлено через 4 минуты Почитайте уже В языке программирования C++ оператор delete возвращает память, выделенную оператором new, обратно в кучу. Вызов delete должен происходить для каждого вызова new, чтобы избежать утечки памяти. После вызова delete объект, указывающий на этот участок памяти, становится некорректным и не должен больше использоваться. Многие программисты присваивают 0 (нуль-указатель) указателям после использования delete, чтобы минимизировать количество ошибок программирования.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
08.02.2013, 11:32 [ТС] | 23 |
По этому я и спрашиваю. ) Да, да, да, пойду книжки читать.
Вот теперь понятно. Спасибо. Еще бы для полного понимания знать механизм вот этого, в трех словах: Но вертаясь к первоначальному вопросу: получается никак нельзя по указателю узнать размер массива? И сам delete так же не знает этого, правильно?
0
|
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
|
|
08.02.2013, 11:45 | 24 |
Для частных случаев решение возможно, общего решения нет. Да оно и не нужно никому.
delete вообще ничего не знает, это же функция Записать, а потом найти количество элементов для вызова деструкторов - задача компилятора.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
08.02.2013, 11:59 [ТС] | 25 |
Удобнее было бы на мой взгляд. К примеру глобально объявленный массив инициируется в какой-то функции. Зачем мне объявлять глобально инициализирующую переменную и везде ее таскать за собой, когда можно было бы померить массив, когда это потребовалось.
А вон тот мой фокус с вычислением количества элементов целочисленного массива почему сработал?
0
|
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
|
|
08.02.2013, 12:16 | 26 |
Потому что в большинстве хороших программ глобально объявленные массивы, переменные и прочее на самом деле используются крайне редко. Когда вы это поймёте, большинство вопросов отпадут сами собой.
Возможно, это тот самый частный случай для отдельно взятого компилятора. Возможно, это совпадение. Вы ведь не все возможные варианты проверили? Например, для массивов структур? Так что пока это не более, чем фокус.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
08.02.2013, 12:21 [ТС] | 27 |
Понял.
Если вас не затруднит, попробуйте провернуть тоже самое у себя. Получится?
0
|
08.02.2013, 12:41 | 28 | |||||
Во вторых после удаления mas продолжает указывать туда где раньше были данные, которых теперь нет ( то есть они могут и дальше там лежать а могут и нет т.е. - мусор ) Добавлено через 3 минуты Работал по тому что то массив, а не указатель на массив
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
08.02.2013, 13:07 | 29 |
SatanaXIII, соглашусь с вами, что было бы не плохо получать размер массива по указателю на него. Но нет такой ф-ции! Нет и все тут. Вы можете придумать разные фокусы, что бы обойти это, но это только фокусы, сегодня они работают, а завтра нет. Смиритесь с тем, что вам придется таскать с собой размер массива или использовать другие возможности языка (списки, вектора и т.д.).
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
08.02.2013, 13:17 | 31 |
массивы быстрее
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||
08.02.2013, 13:44 | 33 | |||||
Вот в этом примере у меня получилось 20.5 сек против 15 в пользу массивов
1
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
08.02.2013, 13:47 [ТС] | 34 |
Имя массива это и есть указатель на его первый элемент. Или нет?
Запомнили. Да. Все так. mas = NULL это просто защита от собственных ошибок.
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
08.02.2013, 13:56 | 35 |
Если в моем примере который я написал выше, поменять double на int, то выигрыш становится еще существеннее 12сек против 7.5 в пользу массивов
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
04.04.2013, 15:12 [ТС] | 36 |
А ведь есть еще оператор new[]. Но по умолчанию компилятор сам распознает и вставляет его на место обяного new.
1
|
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
|
|
09.09.2013, 11:19 | 37 |
Можно вообще на ассемблер перейти. Что случится с памятью, выделенной под V1, если при выделении V2\V3 выскочит какой-то ексепшн? В случае с контейнерами она освободится, а в случае с массивами?
0
|
09.09.2013, 11:19 | |
09.09.2013, 11:19 | |
Помогаю со студенческими работами здесь
37
Удаление динамического массива с сохранением его значений Создание динамического массива и его заполнение Создание динамического массива и его обработка Ошибка, создание динамического массива и его вывод Создание динамического массива строк и его сортировка Создание динамического массива и его инициализация в конструкторе класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |