Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
CatsCanFly
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
#1

О перевыделении памяти для массива объектов - C++

28.07.2013, 17:04. Просмотров 1662. Ответов 23
Метки нет (Все метки)

Мне необходимо сделать динамический массив объектов класса, который будет расширяться при необходимости.
Понятно, что для такого существует выделение через malloc и перевыделение через realloc, но malloc не годится для объектов, тк не вызывает конструктор. Посоветуйте максимально эффективный с точки зрения производительности вариант пожалуйста (думал над выделением новой памяти через new[], копирования из существующего массива объектов в новый и удаление исходного, но мне вариант это показался некрасивым). Готовые решения типа std::vector использовать нельзя.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2013, 17:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос О перевыделении памяти для массива объектов (C++):

Освобождение памяти для объектов производного класса - C++
Всем привет. Не могу найти инфу в интернете, всё перерыл, но понял что случай специфичный у меня. Придумал себе конструкцию, но не уверен,...

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

Выделение памяти для массива через функцию и использование этого массива - C++
Я определяю свою структуру, создаю динамический массив, где будут храниться элементы этой структуры. Есть функция которая выделяет память,...

Метод для массива объектов класса - C++
Существует класс mybook, в котором автор, название книги и год издания являются полями данных. Есть три метода, два из которых служат для...

Функция для перевыделения памяти для массива - C++
Доброго времени суток, пишу шаблонный класс для массива и никак не могу разобраться с динамическим перевыделением памяти посредством new &&...

Нужно ли вызывать деструкторы для объектов помувленного массива? - C++
Собственно, сабж. Будет ли правильным вызывать деструкторы элементов массива, которые были перемещены, или это бесполезная трата...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CatsCanFly
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
03.08.2013, 12:28  [ТС] #16
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Решение простое: никогда не хранить в контейнерах объекты, не являющиеся значениями. Объект, который нельзя просто так взять и скопировать — это не значение. Объект, деструкторы которого влияют не только на него самого — это не значение. Самый простой способ превратить объекты в значения: хранить указатели на объекты. Желательно какой-нибудь shared_ptr, а не просто голый указатель, потому что тогда не придётся танцевать с бубном, чтобы стандартые алгоритмы STL работали правильно и не теряли объекты.

Ах да, и никаких memcpy() для не POD-типов (читай: тупо интов, флоатов, или там сишных структурок).
Если никогда не хранить так подобные объекты, то как поступать, когда это все же приходится делать? Например класс - динамический расширяемый массив строк разной длины, ну или хотя бы таких же массивов?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
03.08.2013, 13:12 #17
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Решение простое: никогда не хранить в контейнерах объекты, не являющиеся значениями.
Довольно странное решение. Если у объекта есть корректный конструктор копий, оператор = и деструктор, как же его контейнер сломает? Пример можно? а то я не допёр.

Добавлено через 1 минуту
Цитата Сообщение от CatsCanFly Посмотреть сообщение
Olivеr, Спасибо, но у меня почему то нет функции make_move_iterator (конечно, файл <iterator> подключен). Использую VC++ 2008
некоторые пихают с++11 куда надо и не надо!

Добавлено через 3 минуты
Цитата Сообщение от CatsCanFly Посмотреть сообщение
Так вот, при удалении старого массива в этом методе вызовется и деструктор для объектов класса SomeClass, в котором будет освобождена память в которой хранились его собственные массивы, что в результате делает копирование бессмысленным - указатели в скопированных на новое место объектах остались, а память на которую они указывали мы потеряли.
А кто тебя просил мешать С и С++? Как бы я не уважал Си, но очевидно же! memcpy не вызывает перегруженного оператора =
А в корректном копировании через цикл (или через std::copy) он бы вызвался и сохранил бы нам данные от удаления деструктором.
Правило трёх же! http://ru.wikipedia.org/wiki/%D0%9F%...BD%D0%B8%D0%B5)

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void CArray::resize(size_t new_size)
{
    SomeClass* temp = new SomeClass[new_size];
    size=std::min(size, new_size);
//memcpy(temp, this->arr; sizeof(SomeClass) * new_size); // !!! уверен, так нельзя делать
    std::copy(arr, arr+size, temp); 
/*альтернативный вариант тоже корректно работает, если оператор = корректно перегружен
    for (size_t i=0; i<size; i++)
        temp[i]=arr[i];
*/
    delete[] arr;
    arr=temp;
}
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.08.2013, 13:15 #18
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Довольно странное решение. Если у объекта есть корректный конструктор копий, оператор = и деструктор, как же его контейнер сломает? Пример можно? а то я не допёр.
Никак. То, что вы описали, — это и есть определение объекта-значения.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
некоторые пихают с++11 куда надо и не надо!
А некоторые разводят тут луддизм.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
03.08.2013, 13:18 #19
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
А некоторые разводят тут луддизм.
И как же это, если человек сам сказал, что у него MSVS2008. Что теперь IDE каждый год переустанавливать?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
03.08.2013, 13:23 #20
Kuzia domovenok, Учитывая, что сейчас текущая версия - MSVC2012, то ДА.
Ну или не пользоваться фичами, но это не значит, что люди на форуме не могут использовать С++11 там где удобно, любой код с использованием С++11 можно переписать на С++03 так-то (ну ок, не берем в расчет variadic templates).
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
03.08.2013, 13:34 #21
Цитата Сообщение от ForEveR Посмотреть сообщение
Kuzia domovenok, Учитывая, что сейчас текущая версия - MSVC2012, то ДА.
Ну или не пользоваться фичами, но это не значит, что люди на форуме не могут использовать С++11
А я и не говорю обо всём форуме. Автор тут CatsCanFly, и компилятор у него vs2008. Зачем же советовать то, что ему не подходит?

Не по теме:

Как зачем? Попонтоваться знаниями СРР11 в случайной теме, конечно же!

ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
03.08.2013, 13:43 #22
Kuzia domovenok, Может вы глаза откроете все же? Я прошу предоставить мне цитату, где ТС упоминал, что он использует MSVC2008, ДО сообщения Oliver.
CatsCanFly
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 21
03.08.2013, 14:20  [ТС] #23
Kuzia domovenok, Большое спасибо, многое прояснили
silent_1991
07.08.2013, 14:32     О перевыделении памяти для массива объектов
  #24

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Попонтоваться знаниями СРР11 в случайной теме, конечно же!
Глупости. На дворе вторая половина (да считай уже конец) 2013 года, но почему-то многим до сих пор кажется, что 11 стандарт только вчера вышел. Непонятно, почему с 2003 стандартом такого не было, все с самого начала юзали и лыбу давили.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2013, 14:32
Привет! Вот еще темы с ответами:

Как правильно создать и вызвать конструктор для массива объектов? - C++
Сам класс class Planet{ public: string name; protected: double diameter; private: int sputniks, number, distance; public: ...

Выделение памяти для массива - C++
верно ли выделил память для массива если нет поправьте, заранее спасибо) class type { private: int ***p; int x, y, z; public: ...

Выделение памяти для массива - C++
Пишу такой код: int main() { int* arr1 = new int; } Всё норм. Теперь такой:

нехватает памяти для массива - C++
Народ!!! Подскажите плз, я пишу прогу на C++ в IDE Eclipse, делаю массив int mas , и мне кажется нехватает для этого массива памяти(при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.08.2013, 14:32
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru