|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
||
realloc и вызов конструктора20.05.2011, 13:52. Показов 23699. Ответов 35
Метки нет (Все метки)
здраствуйте! мне препод сказал, что можно выделить память оператором new, а потом довыделить её с помощью realloc и каким-то образом вызвать конструкторы для новой памяти(ну или это я так его понял
). Как это можно сделать?задание вобще такое:
0
|
||
| 20.05.2011, 13:52 | |
|
Ответы с готовыми решениями:
35
вызов конструктора вызов конструктора Вызов конструктора |
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|||
| 21.05.2011, 07:57 [ТС] | |||
|
посмотрите, что я нашёл: http://ru.wikipedia.org/wiki/New_(C%2B%2B)
а именно следующее:
1
|
|||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 21.05.2011, 10:56 | |
|
pito211, placement new - хорошая вещь, да. Но используется редко все же.
0
|
|
|
|
|
| 21.05.2011, 11:00 | |
|
pito211, placement new в твоём случае принципиально не отличается. Ибо что вызов new, что вызов malloc + new дадут по сути один и тот же результат. При этом на пару с realloc этот placement new всё равно работать толком не будет. В том смысле, что ничего нового не даст. malloc/realloc - интерфейсы для выделения plain-памяти, которая НЕ трактуется как массив объектов. Т.е. если ты вызвал realloc, то данные от объектов у тебя скопируются, но они скопируются как образ памяти, но не как объекты, потому что никаких операций присваивания или конструкторов вызываться не будет (хотя новые объекты как бы появились). Такая работа может послужить дополнительным источником ошибок
2
|
|
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|||||||||||
| 21.05.2011, 11:29 | |||||||||||
|
Вот кой-какой материал по этой теме
Большинство методов очень просты, поэтому реализованы непосредственно в классе. Операции доступа по индексу используют для проверки индекса приватную функцию rangecheck() . В классе три поля: указатель на выделенную память elems, поле Size определяет количество зарезервированных элементов, а поле Count содержит количество присутствующих в массиве элементов. Очевидно, что поле Count увеличивается по мере добавления элементов в массив. Как только значение поля Count сравняется со значением поля Size, необходимо выделять новую память. Последовательный доступ к элементам динамического массива осуществляется итератором, который просто является указателем соответствующего типа. Поэтому в шаблоне не определен класс для итератора . Методы, принимающие параметры-итераторы или выдающие итератор-результат фактически работают с указателями на элементы массива — их реализация очень проста. Конечно, это снижает безопасность нашего кода, но в данном случае нам важнее разобраться с управлением памятью. Класс массива обеспечивает получение начального (методы begin()) и конечного (методы end()) значения итератора, получение значения первого (методы front()) и последнего (методы back()) элемента. Конечное значение итератора, как обычно, — за последним элементом массива. Перемещение по элементам и получение значения элемента выполняется операциями с указателями (операции инкремента, декремента и разыменования). Реализация остальных методов представлена в листинге 9.2.
2
|
|||||||||||
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|||
| 21.05.2011, 12:22 [ТС] | |||
0
|
|||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 21.05.2011, 12:26 | ||
|
0
|
||
|
|
|||
| 21.05.2011, 14:22 | |||
|
0
|
|||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 25.05.2011, 23:24 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Вот дополнительный материал по управлению памятью. Дам в нескольких ответах - много материала.
Свободная память и куча Динамическая память выделяется объектам во время выполнения программы с помощью специальных операций new и new[][1-5.3.4]. Возврат динамической памяти (и уничтожение объектов при этом) тоже выполняются специальными операциями delete и delete[] [1-5.3.5]. В стандарте [1-12.5] такая динамическая память называется «свободной» памятью — мы ниже рассмотрим подробности работы с ней. Однако С++ включает и другой вид динамической памяти, о котором в стандарте явно не сказано. Дело в том, что в С++ по наследству от С остались функции malloc(), calloc(), realloc() и free() [1-20.4.6], которые тоже работают с динамической памятью. Первые три из них различными способами выделяют динамическую память, а последняя, естественно, освобождает. Герб Саттер [21] называет динамическую память, с которой работают функции malloc()/free() кучей, как она и называется в стандарте С99 [59]. Стандарт С++ не определяет, должны ли быть реализованы операции new/delete с помощью этих функций. Однако в стандарте явно говорится [1-20.4.6/3/4], что функции malloc()/free() не должны быть реализованы с помощью операций new/delete. Поэтому в общем случае свободная память, с которой работают операции new/delete, и динамическая память, с которой работают функции malloc()/free(), — это «две большие разницы». Возможно, в каком-нибудь компиляторе эти два вида динамической памяти и совпадают, но полагаться на это ни в коем случае нельзя. Отсюда следует совершенно однозначный вывод: никогда не «смешивайте» эти два механизма управления динамической памятью в своих программах. Этот совет достоин того, чтобы повторить его еще раз! СОВЕТ Никогда не «смешивайте» два механизма управления динамической памятью в своих программах. Память, выделенная одной из операций new, должна возвращаться системе только соответствующей операцией delete, а память, выделенная одной из функций malloc(), calloc(), или realloc(), должна возвращаться только с помощью функции free(). Добавлено через 6 минут Размещающий new Существует еще одна форма операции new, которая позволяет разделить «во времени и пространстве» операции выделения памяти и конструирования объекта в этой памяти. Эта форма называется «размещающий» new (placement new) и тоже работает только при подключении заголовка
В стандарте определены и соответствующие функции delete:
Рассмотрим несколько простых примеров, чтобы было понятны способы применения этого вида операции new.
Вместо динамического массива мы вполне можем использовать обычный массив, например
Исходный объект и размещаемый, конечно, могут быть разного типа и размера. Но тут нужно быть осторожным, так как компиляторы просто не выдают никаких предупреждающих сообщений .
Отсутствуют сообщения о преобразовании типов и в случае использования массивов:
Отсутствие сообщений о том, что типы разные, может спровоцировать ошибки, например:
Можно поверх скалярной величины разместить массив, и поверх массива — скалярную величину, например
В принципе, использование размещаемого new в этих случаях эквивалентно использованию обычного указателя, например
Размещающий new обычно применяется как раз не для встроенных типов. Еще раз напомним, что работа «обычного» new состоит из двух операций: выделение памяти и вызов конструктора для конструирования объекта. Память размещающий new не выделяет, но вызов конструктора выполняется и в этом случае. Но тогда возникает проблема вызова деструктора — для «обычных» динамических объектов деструктор вызывался автоматически операцией delete. Однако для размещающего new операцию delete выполнять не нужно, поэтому и деструктор автоматически не вызывается! Решение очень простое: нужно вызвать деструктор явно [1-12.4/13]. Рассмотрим пример (листинг 8.5).
Заменим в классе Integer конструктор по умолчанию конструктором инициализации:
Вызов деструктора написан в указательном стиле. Можно использовать и привычный синтаксис с индексом, например
В данном случае при выделении памяти использован бестиповый указатель. Ни запрос памяти, ни размещение по этому адресу объекта не требуют преобразования типа. А вот разрушение объекта без преобразования указателя вызывает протесты компилятора — C++ Builder 6 выдает ошибку E2288:
Поскольку р не является типизированным указателем на структуру, «возмущение» компилятора совершенно обосновано. Точно так же с явным преобразованием типа необходимо обращаться к методам размещенного объекта. Пусть, например, в классе Integer определен метод:
0
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||
| 25.05.2011, 23:48 | ||
![]() К тому же там не совсем то, что здесь. Во-вторых, это на другом сайте. А теперь - здесь есть. ![]() Вон, чел в Вики статью видел, а на РСДН даже и не думал искать...
1
|
||
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
|
| 26.05.2011, 09:17 [ТС] | |
|
спасибо!
realloc+(placement new) не катит, а жаль! вобще я смотрел в моей VS 2008 там new реализован через malloc, и если бы я написал то оно нормально работало, но если кому то взбредёт в голову переписать new, то класс мой накроется медным тазом?
0
|
|
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
| 26.05.2011, 09:19 | |
|
Вообще-то о перегрузке new() - много материала. Тут самый лучший способ - перегружать new в конкретном классе, не трогая глобальный. Тогда ничего медным тазом не накрывается...
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||
| 26.05.2011, 11:02 | ||
|
Наиболее приличный вариант написал Валерий Викторович Лаптев в посте 21.05.2011 11:29.
0
|
||
|
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
|
||
| 26.05.2011, 14:22 [ТС] | ||
![]() Добавлено через 2 часа 43 минуты блин, а я не знал, что реаллок освобождает память, если блок передвинут на новое место. Тогда память пропадёт, жаль
0
|
||
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||
| 26.05.2011, 15:43 | ||
|
Здесь дело даже не в этом. Присоединяюсь к мнению коллеги Evg:
Если препод бестолковый из разряда "у меня работает, значит можно" - это очень плохо.
0
|
||
| 26.05.2011, 15:43 | |
|
Вызов конструктора копий Вызов базового конструктора Неоднозначный вызов конструктора
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе.
Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I
Обработка содержит следующие. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
|
|
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него.
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952
Инструкция внутри.
https:/ / youtu. be/ VpfFZSUDGnQ. . .
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|