0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
|
|
1 | |
О перевыделении памяти для массива объектов28.07.2013, 17:04. Показов 8685. Ответов 23
Метки нет (Все метки)
Мне необходимо сделать динамический массив объектов класса, который будет расширяться при необходимости.
Понятно, что для такого существует выделение через malloc и перевыделение через realloc, но malloc не годится для объектов, тк не вызывает конструктор. Посоветуйте максимально эффективный с точки зрения производительности вариант пожалуйста (думал над выделением новой памяти через new[], копирования из существующего массива объектов в новый и удаление исходного, но мне вариант это показался некрасивым). Готовые решения типа std::vector использовать нельзя.
0
|
28.07.2013, 17:04 | |
Ответы с готовыми решениями:
23
Освобождение памяти для объектов производного класса Резервирование памяти/освобождение памяти для трехмерного массива Выделение памяти для массива через функцию и использование этого массива Метод для массива объектов класса |
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
|
|
28.07.2013, 17:11 | 3 |
Мне кажется не получится, т.к при новом выделении сотрутся старые данные. Как вариант заранее обьявлять большое кол-во чтоб хватило
0
|
alsav22
|
28.07.2013, 17:19
#4
|
0
|
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
|
||||||
28.07.2013, 17:32 | 5 | |||||
Ну вот пример.
0
|
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
|
|
28.07.2013, 18:05 | 7 |
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
||||||
28.07.2013, 18:17 | 8 | |||||
0
|
Неэпический
|
|
28.07.2013, 18:32 | 9 |
0
|
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
|
|
28.07.2013, 18:43 | 10 |
0
|
150 / 137 / 35
Регистрация: 29.07.2012
Сообщений: 709
|
|
28.07.2013, 18:57 | 12 |
Все понятно.
0
|
415 / 411 / 95
Регистрация: 06.10.2011
Сообщений: 832
|
||||||
28.07.2013, 19:24 | 13 | |||||
http://ideone.com/WQ63ec
1
|
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
|
||||||||||||||||
03.08.2013, 11:57 [ТС] | 14 | |||||||||||||||
Olivеr, Спасибо, но у меня почему то нет функции make_move_iterator (конечно, файл <iterator> подключен). Использую VC++ 2008, как я понял из гугла, make_move_iterator есть только в новом стандарте, который 2008 студией не поддерживается. А можно показать пример максимально простой? STL я еще не изучал, и использовать ее не желательно к тому же, необходимо изучить максимально подробно работу с памятью для объектов, а не пользоваться готовыми решениями STL (задача то не практическая а в целях изучения).
Суть такова, у меня есть класс, который является максимальноп простой реализацией динамического расширяемого массива объектов, например:
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
03.08.2013, 12:19 | 15 |
Решение простое: никогда не хранить в контейнерах объекты, не являющиеся значениями. Объект, который нельзя просто так взять и скопировать — это не значение. Объект, деструкторы которого влияют не только на него самого — это не значение. Самый простой способ превратить объекты в значения: хранить указатели на объекты. Желательно какой-нибудь shared_ptr, а не просто голый указатель, потому что тогда не придётся танцевать с бубном, чтобы стандартые алгоритмы STL работали правильно и не теряли объекты.
Ах да, и никаких memcpy() для не POD-типов (читай: тупо интов, флоатов, или там сишных структурок).
0
|
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
|
|
03.08.2013, 12:28 [ТС] | 16 |
Если никогда не хранить так подобные объекты, то как поступать, когда это все же приходится делать? Например класс - динамический расширяемый массив строк разной длины, ну или хотя бы таких же массивов?
0
|
03.08.2013, 13:12 | 17 | |||||
Довольно странное решение. Если у объекта есть корректный конструктор копий, оператор = и деструктор, как же его контейнер сломает? Пример можно? а то я не допёр.
Добавлено через 1 минуту некоторые пихают с++11 куда надо и не надо! Добавлено через 3 минуты А кто тебя просил мешать С и С++? Как бы я не уважал Си, но очевидно же! memcpy не вызывает перегруженного оператора = А в корректном копировании через цикл (или через std::copy) он бы вызвался и сохранил бы нам данные от удаления деструктором. Правило трёх же! http://ru.wikipedia.org/wiki/%... 0%B8%D0%B5) Добавлено через 8 минут
1
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
03.08.2013, 13:15 | 18 |
Никак. То, что вы описали, — это и есть определение объекта-значения.
А некоторые разводят тут луддизм.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
03.08.2013, 13:23 | 20 |
Kuzia domovenok, Учитывая, что сейчас текущая версия - MSVC2012, то ДА.
Ну или не пользоваться фичами, но это не значит, что люди на форуме не могут использовать С++11 там где удобно, любой код с использованием С++11 можно переписать на С++03 так-то (ну ок, не берем в расчет variadic templates).
1
|
03.08.2013, 13:23 | |
03.08.2013, 13:23 | |
Помогаю со студенческими работами здесь
20
Функция для перевыделения памяти для массива Нужно ли вызывать деструкторы для объектов помувленного массива? Фейл на перевыделении памяти для стека Ручное распределение памяти для массива объектов класса Qt Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |