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

Allocator и shared_ptr - C++

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

std::allocator C++
C++ std::allocator
C++ allocator своя версия
allocator C++
C++ allocator, при компиляции ошибка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GbaLog-
Не Эксперт C++
1429 / 615 / 173
Регистрация: 24.08.2014
Сообщений: 2,488
Записей в блоге: 1
Завершенные тесты: 2
23.03.2016, 12:44     Allocator и shared_ptr #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
yrceus, Посмотрите std::allocate_shared();
Поможет, если я правильно вас понял.
yrceus
 Аватар для yrceus
80 / 80 / 54
Регистрация: 25.08.2013
Сообщений: 321
23.03.2016, 13:39  [ТС]     Allocator и shared_ptr #3
Ага, здорово, прочитал, что смог. А можете от себя добавить.
1. Выделение памяти происходит без создания объектов и далее уже не требуется для удаления никаких функций?
2. После такого выделения памяти указатель shared_ptr имеет неопределенное значение?

И вот строчка, выделяется под пары(пару)? Не понял аргументы.
C++
1
auto baz = std::allocate_shared<std::pair<int,int>> (alloc,30,40);
Это с cpp.com
GbaLog-
Не Эксперт C++
1429 / 615 / 173
Регистрация: 24.08.2014
Сообщений: 2,488
Записей в блоге: 1
Завершенные тесты: 2
23.03.2016, 14:02     Allocator и shared_ptr #4
Цитата Сообщение от yrceus Посмотреть сообщение
1. Выделение памяти происходит без создания объектов и далее уже не требуется для удаления никаких функций?
Удалять не требуется, да, но только если не имеете собственных деструкторов для объектов. Почему вы считаете, что объект не создается? В вашем же примере с парой видно все.
Цитата Сообщение от yrceus Посмотреть сообщение
2. После такого выделения памяти указатель shared_ptr имеет неопределенное значение?
Вообще-то, такое выделение возвращает std::shared_ptr, то есть это по сути та же фабричная функция std::make_shared();, только она ещё и выделяет память с помощью переданного ей как alloc объекта.
Цитата Сообщение от yrceus Посмотреть сообщение
И вот строчка, выделяется под пары(пару)? Не понял аргументы.
Под пару. std::shared_ptr не имеет конструкторов под создание массивов.
yrceus
 Аватар для yrceus
80 / 80 / 54
Регистрация: 25.08.2013
Сообщений: 321
23.03.2016, 14:30  [ТС]     Allocator и shared_ptr #5
GbaLog-, разжуйте еще...))) Не понял, чем отличаются make_shared<>() от allocate_shared<>()?
только она ещё и выделяет память с помощью переданного ей как alloc объекта.
не понял...
Понял, что происходит обращение к объекту alloc для выделения памяти и передаются остальные агрументы в конструктор для создания, но в чем фишка тогда?
В чем идея самого allocate? Как я понял, резервировать память без создания объектов, потому как неизвестно нужны они будут или нет, а место пригодится.
А тут вроде и инициализация происходит, с той же парой пример и зачем оно тогда?
GbaLog-
Не Эксперт C++
1429 / 615 / 173
Регистрация: 24.08.2014
Сообщений: 2,488
Записей в блоге: 1
Завершенные тесты: 2
23.03.2016, 14:47     Allocator и shared_ptr #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 Посмотреть сообщение
А тут вроде и инициализация происходит, с той же парой пример и зачем оно тогда?
Я думаю, что для того, чтобы предусмотреть расширение требуемой объектом памяти.
Yandex
Объявления
23.03.2016, 14:47     Allocator и shared_ptr
Ответ Создать тему
Опции темы

Текущее время: 17:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru