Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Создание динамического массива структур и его удаление06.02.2013, 10:06. Показов 24729. Ответов 36
Господа, поясните пожалуйста следующий момент:
создаю структуру:
P.S. И правильно ли удалять такую конструкцию именно delete [], а не просто delete?
0
|
06.02.2013, 10:06 | |
Ответы с готовыми решениями:
36
Удаление динамического массива структур Создание копии динамического массива структур Создание динамического массива структур Преобразование кода в ряд структур, создание динамического массива |
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
|
|
06.02.2013, 12:05 | 2 |
Правило простое, если new[], то и delete []
По 1 вопросу: после new возвращается указатель на блок выделенной памяти, перед этим блоке формируются дополнительные байты, в которых хранится размер, delete оттуда и берет информацию о том, сколько надо освободить памяти.
0
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
06.02.2013, 13:25 [ТС] | 3 |
Грубо говоря, на два объявленных TTList-a new разместит в ячейках памяти приблизительно следующее:
Да? Но если delete знает сколько ему удалять, то почему нельзя таким образом выяснить и размер занимаемой памяти?
0
|
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
|
|
06.02.2013, 14:31 | 4 |
Позвольте процитировать т-ща Тарасевича с RSDN:
E>Логика: мы не можем ..., а компилятор — может, меня и смутила. E>Вопрос произошел от указанной темы об определении размера массива, поэтому и стало интересно, кто чего может. То есть я перефразировал бы свою мысль следующим образом: почему компилятор имеет средства для определения размера массива (то есть количества элементов), а программа таких стандартных средств не имеет. Я совсем недавно отвечал на точно такой же вопрос в comp.lang.c++: http://groups.google.com/group... otmail.com Еще раз и по-русски: Компилятор совсем не обязательно имеет средства для определения размера массива, выделенного в динамической памяти. Он компилятора требуется только то, чтобы он умел правильно выделять такие массивы при помощи 'new[]' и правильно уничтожать такие массивы при помощи 'delete[]'. Как компилятор это делает и какая дополнительная информация понадобится для этого компилятору и понадобится ли она вообще — личное дело компилятора. Классическим примером такой дополнительной информации является количество сконструированных элементов в массиве, которое нужно, например, для того, чтобы правильно выполнить деструкцию элементов массива. Если компилятору эта информация нужна только для того и только для того, чтобы вызвать правильное количество деструкторов, то сразу приходит на ум очевидная оптимизация: если хранимые в массиве объекты не имеют деструкторов (т.е. не являются экземплярами классов) или имеют тривиальные деструкторы (т.е. фактически тоже не имеют деструкторов), то знать количество элементов в массиве компилятору совершенно незачем, и формировать и хранить это количество нигде не надо. Эту оптимизацию используют многие компиляторы, включая MSVC и GCC. Если бы существовали стандартные средства для определения размера динамически выделенного массива через указатель на его первый элемент, то компиляторам пришлось бы сохранять информацию о размере всегда. Вышеописанная оптимизация использования памяти была бы невозможна. Это во-первых. Во-вторых, для единообразия, пришлось бы поддержать эту функциональность и для статических и автоматических массивов, что тоже несколько противречит общему духу встроенных С/С++ массивов. Все это, на мой взгляд, выглядит совершенно не нужно. Особенно если учесть, что пользователь при выделении массива держал в руках его размер и мог сам позаботиться о сохранении этого размера для дальнейшего использования.
0
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
06.02.2013, 15:23 [ТС] | 5 |
То есть (прочитал вдумчиво и шесть раз) механизм запоминания/определения размера динамически выделенного массива существует, но просто он не унифицирован для разных компиляторов и следовательно специально сделан недоступным?
И куча мелких вопросов в попытке как-то оправдать свое непонимание: Дык вроде тот же sizeof размер статических массивов прекрасно достает. Почему, зная какой ты в данный момент используешь компилятор, все равно нельзя докопаться до размера? Какое-нибудь описание найти для каждого вида и версии компиляторов. Это совсем, я постесняюсь спросить, дебилизм? Х)
0
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|||||||||||
07.02.2013, 12:13 [ТС] | 7 | ||||||||||
Так delete же берет именно размер именно по указателю. Интерес? - чтобы не таскать за собой еще и переменную с размером, к примеру.
Ведь не нужно же писать типа
0
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
07.02.2013, 16:07 [ТС] | 11 |
В точку!
Ага. mimicria, уже писал об этом. Но толку? ) Добавлено через 1 минуту почему же sizeof не может обратиться к этому N, когда оно вот прям лежит - бери не хочу?
0
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
||||||
07.02.2013, 16:46 [ТС] | 13 | |||||
О том, что
0
|
07.02.2013, 16:47 | 14 | |||||
Сработает почему нет ?
0
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
||||||
07.02.2013, 16:57 [ТС] | 15 | |||||
Нас интересует случай с
Что-то у меня внезапное прозрение - а может delete вовсе и не удаляет ничего, а только вытирает указатель?
0
|
07.02.2013, 17:00 | 16 |
Ну правильно это ведь указатель на массив, а не сам массив...
Добавлено через 1 минуту Когда кажется креститься нада Тобиш книги читать... но это видимо не в вашем случае
0
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
07.02.2013, 17:01 [ТС] | 17 |
Общий смысл: delete так же ничего не удаляет, а просто заставляет считать, что память под указателем свободна? Но ничего, повторюсь, ничего кроме этого не удаляет.
0
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
||||||||||||||||
08.02.2013, 09:48 [ТС] | 19 | |||||||||||||||
А вот это я получается удаляю массив?
Вот методом научного тыка, по предположению, что она лежит перед первым элементом массива проведен следующий эксперимент (работает птолько с целочисленным массивом):
Код
0 = 14 (6 должно быть) 1 = 14 (10 должно быть) 2 = 14 3 = 18 4 = 22 5 = 26 6 = 30 7 = 34 ... 10 = 46 ... 100 = 406 P.S. Builder 6 Build 10.161 P.P.S. Я думаю можно найти расположения и для остальных типов данных, мониторя всю память. Но легче узнать устройство компилятора и так выяснить куда он что пишет.
0
|
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
|
||||||||||||||||
08.02.2013, 10:00 | 20 | |||||||||||||||
Нет, не равнозначны. Когда уже престанете страдать ерундой и начнёте читать по теме?
Нулевые указатели придуманы как удобный способ «отметить» указатели, которые заведомо не указывают на корректный адрес в памяти. Например, при объявлении указателя как автоматической переменной его значение не определено. Чтобы отметить, что этот указатель ещё не содержит корректный адрес в памяти, такому указателю присваивают константу нулевого указателя:
3
|
08.02.2013, 10:00 | |
08.02.2013, 10:00 | |
Помогаю со студенческими работами здесь
20
Удаление динамического массива с сохранением его значений Создание динамического массива и его заполнение Создание динамического массива и его обработка Ошибка, создание динамического массива и его вывод Создание динамического массива строк и его сортировка Создание динамического массива и его инициализация в конструкторе класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang
Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
|
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
|
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
|
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
|
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
|
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента!
4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве).
Первое вводное занятие. . .
|
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
|
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений
Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
|
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
|
UserScript для подсветки кнопок языков программирования в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения:
/ / ==UserScript==
/ / @name CF_DefaultLangSelect
/ / . . .
|
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
|
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
|