Продлить жизнь объекта
Есть некоторый Handler по обработке массивов данных
using Image = std::vector<char>;
using Images = std::vector<Image>;
class Handler : public std::enable_shared_from_this<Handler>
{
public:
Handler(const std::shared_ptr<Sender>& sender)
: m_sender(sender){}
~Handler() = default;
void handleData(Images images)
{
auto asyncSend = std::bind(&Handler::makeMessage, this,
std::placeholders::_1,
std::placeholders::_2);
AsioPool::run(std::move(asyncSend), std::move(images), shared_from_this());
}
private:
void makeMessage(Images images, std::shared_ptr<Handler> self)
{
Image result;
for (const auto& image : images)
{
// Тяжелые вычисления
}
m_sender->send(std::move(result));
}
private:
std::shared_ptr<Sender> m_sender;
};
в одном из потоков создается много этих Handler-ов
std::vector<std::shared_ptr<Handler> handlers;
for (...)
handlers.emplace_back(std::make_shared<Handler>(sender_ptr));
Другой поток через Handler-ы обрабатывает данные
for (auto& handler : handlers)
handler->handleData(std::move(images));
Третий поток, может удалить эти Handler-ы
handlers.clear();
В результате, в момент, когда AsioPool::run(...) дойдет до выполнения Handler::makeMessage самого объекта может уже не существовать, если не передавать в метод shared_from_this(). AsioPool::run(...) это обертка над бустовым asio, работает по принципу "отдал и забыл".
Какие есть еще методы продлить жизнь объекту, без передачи своего shared_ptr ?