В моем проекте есть класс Factory, который возвращает std::shared_ptr<MyClass>
, если вызывается метод Create
. Фабрика не является владельцем, но ведет список созданных объектов. Иногда фабрике необходимо перебрать созданные объекты, которые все еще используются, или подсчитать их.
Я реализовал это, используя std::vector<std::weak_ptr<MyClass>>
. Итерация выглядит так:
for (std::weak_ptr<MyClass> wp : weak_list) {
if (auto sp = wp.lock()) {
//..
}
}
Функция Create
:
std::shared_ptr<MyClass> Create(/* ... */) {
std::shared_ptr<MyClass> obj = std::make_shared<MyClass>();
//...
weak_list.push_back(obj);
return obj;
}
Является ли вектор лучшим контейнером для такого списка? Может быть, std::set
было бы лучше.
Если я реализую это с помощью вектора, мне придется регулярно проверять указатели с истекшим сроком действия в списке и удалять их.
Каков предпочтительный способ хранения списка слабых указателей в фабричном классе?
std::make_shared
, если вы хотите использоватьstd::weak_ptr
- stackoverflow.com/questions/32113594/ - person luantkow   schedule 20.08.2017weak_list
этоstd::vector<std::weak_ptr<MyClass>>
.obj
shared_ptr
возвращается, поэтому я позвонилmake_shared
- person Iter Ator   schedule 20.08.2017shared_ptr
, но сохраняетеweak_ptr
для нового объекта. Если вы создадитеstd::shared_ptr
сstd::make_shared
, выделенная память будет освобождена только после уничтожения последнегоstd::weak_ptr
. Это не утечка памяти, но ваше приложение может использовать больше памяти, чем могло бы. - person luantkow   schedule 20.08.2017