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

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

Войти
Регистрация
Восстановить пароль
 
yrceus
82 / 82 / 54
Регистрация: 25.08.2013
Сообщений: 326
#1

Allocator и shared_ptr - C++

23.03.2016, 11:32. Просмотров 240. Ответов 5
Метки нет (Все метки)

Прокомментируйте пожалуйста. Есть ли смысл и вообще возможность оформлять зарезервированную память allocator-ом в shared_ptr? Или это вообще приведет к ошибке или некорректному поведению(утечке памяти например)?
Я что-то запутался совсем.
То есть резервируем пустую область точного размера
C++
1
2
3
class obj;
allocator<obj> alloc;
auto ptr = make_shared<obj>(alloc.allocate(10));
И как теперь? Получили фактически область под массив объектов, пустую(не вызывая конструкторы объектов), по мере кода создали там объекты. А после? Об удалении и освобождении памяти уже позаботится shared_ptr? Или как? То есть тогда отпадает необходимость использования destroy и deallocate?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2016, 11:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Allocator и shared_ptr (C++):

Распределитель памяти идентичный std::allocator. Непонятные синтаксис и концепция std::allocator::construct - C++
Компилятор: MSVC 2010 Exress код моего класса распределяющего память под спойлером #include &lt;stdlib.h&gt; // my memory allocator...

allocator - C++
Здорова! Есть задачка:&quot;Завершите или реализуйте с самого начала Pool_alloc (параграф 19.4.2) так, чтобы обеспечивались все возможности...

std::allocator - C++
Здравствуйте! Подскажите почему возникает ошибка сегментирования: using std::cout; using std::endl; int main() { ...

Ошибка с allocator - C++
Приветствую. Пользуюсь Dev-C++. При выполнении кода, ошибка, что на скрине. #include &lt;iostream&gt; int main() { ...

std::allocator - C++
я не смог найти хорошего описания роботы с аллокатором, так что спрашиваю у тех, кто с ним работал std::allocator::allocate (size_type...

Vector allocator SQLite - C++
Гуру, помогите новичку! Столкнулся с проблемой, и даже не понимаю в чем она... Надо: сделать список(вектор) для хранения ссылок...

5
GbaLog-
Любитель чаепитий
2899 / 1356 / 333
Регистрация: 24.08.2014
Сообщений: 4,796
Записей в блоге: 1
Завершенные тесты: 2
23.03.2016, 12:44 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
yrceus, Посмотрите std::allocate_shared();
Поможет, если я правильно вас понял.
1
yrceus
82 / 82 / 54
Регистрация: 25.08.2013
Сообщений: 326
23.03.2016, 13:39  [ТС] #3
Ага, здорово, прочитал, что смог. А можете от себя добавить.
1. Выделение памяти происходит без создания объектов и далее уже не требуется для удаления никаких функций?
2. После такого выделения памяти указатель shared_ptr имеет неопределенное значение?

И вот строчка, выделяется под пары(пару)? Не понял аргументы.
C++
1
auto baz = std::allocate_shared<std::pair<int,int>> (alloc,30,40);
Это с cpp.com
0
GbaLog-
Любитель чаепитий
2899 / 1356 / 333
Регистрация: 24.08.2014
Сообщений: 4,796
Записей в блоге: 1
Завершенные тесты: 2
23.03.2016, 14:02 #4
Цитата Сообщение от yrceus Посмотреть сообщение
1. Выделение памяти происходит без создания объектов и далее уже не требуется для удаления никаких функций?
Удалять не требуется, да, но только если не имеете собственных деструкторов для объектов. Почему вы считаете, что объект не создается? В вашем же примере с парой видно все.
Цитата Сообщение от yrceus Посмотреть сообщение
2. После такого выделения памяти указатель shared_ptr имеет неопределенное значение?
Вообще-то, такое выделение возвращает std::shared_ptr, то есть это по сути та же фабричная функция std::make_shared();, только она ещё и выделяет память с помощью переданного ей как alloc объекта.
Цитата Сообщение от yrceus Посмотреть сообщение
И вот строчка, выделяется под пары(пару)? Не понял аргументы.
Под пару. std::shared_ptr не имеет конструкторов под создание массивов.
1
yrceus
82 / 82 / 54
Регистрация: 25.08.2013
Сообщений: 326
23.03.2016, 14:30  [ТС] #5
GbaLog-, разжуйте еще...))) Не понял, чем отличаются make_shared<>() от allocate_shared<>()?
только она ещё и выделяет память с помощью переданного ей как alloc объекта.
не понял...
Понял, что происходит обращение к объекту alloc для выделения памяти и передаются остальные агрументы в конструктор для создания, но в чем фишка тогда?
В чем идея самого allocate? Как я понял, резервировать память без создания объектов, потому как неизвестно нужны они будут или нет, а место пригодится.
А тут вроде и инициализация происходит, с той же парой пример и зачем оно тогда?
0
GbaLog-
Любитель чаепитий
2899 / 1356 / 333
Регистрация: 24.08.2014
Сообщений: 4,796
Записей в блоге: 1
Завершенные тесты: 2
23.03.2016, 14:47 #6
yrceus, Взято с www.cplusplus.com
Allocates memory for an object of type T using alloc and constructs it passing args to its constructor. The function returns an object of type shared_ptr<T> that owns and stores a pointer to the constructed object (with a use count of 1).

This function uses alloc to allocate storage for the object. A similar function, make_shared uses ::new to allocate the storage instead.
Переведу последние строки(мой английский не очень, так что если вы знаете его хорошо, лучше прочтите сами):
"Эта функция использует alloc для выделения памяти для объекта. Подобная функция make_shared использует ::new для выделения памяти вместо этого."
В общем в make_shared используется new, а в allocate_shared используется функциональный объект alloc.

Добавлено через 4 минуты
Цитата Сообщение от yrceus Посмотреть сообщение
А тут вроде и инициализация происходит, с той же парой пример и зачем оно тогда?
Я думаю, что для того, чтобы предусмотреть расширение требуемой объектом памяти.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2016, 14:47
Привет! Вот еще темы с ответами:

allocator своя версия - C++
Доброго времени суток. Мне нужно написать class allocator на подобии стандартного. Он должен содержать следующие методы: Method void*...

allocator std::map - C++
Подскажите вопрос, есть тестовое задание: Подскажите где про это почитать и разъясните по-возможности, что это вообще такое...

Std::allocator<wchar_t>>' to 'LPCWSTR' - C++
собственно есть list&lt;wstring&gt; куда вставили много адресов типа L&quot;D:\\66\\99&quot;; Задача удалять папки по этому адресу (пока что папки пусты...

allocator, при компиляции ошибка - C++
template&lt;class T&gt; class Vec { public: ... private: allocator&lt;T&gt; alloc; ... }


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

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

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