В C++ вы несете ответственность за отслеживание жизни объектов.
Это означает, что вам нужно отслеживать жизнь вещей, содержащих указатели и ссылки на другие вещи, и обеспечивать, чтобы они не жили так долго, как эти вещи.
Вы не выполнили свою задачу. Вы передали лямбды, которые захватывают указатели на объекты, как будто они содержат конфеты, а не прямую линию в кишки вашего объекта.
Решение проблем с продолжительным сроком службы путем обводки общего указателя вокруг обычно является плохими идеями. Увеличение времени жизни ваших объектов более туманно может уменьшить инциденты, связанные с немедленными сбоями, но туманный шар жизни объектов не делает вашу программу работы. Туманный шар либо расширяется, чтобы охватить всю вашу программу, которая теперь никогда не может фактически закрыться, либо крутится вокруг себя и самопожигает, утечка ресурсов.
Общие указатели могут использоваться в узких ситуациях, когда у вас есть определенные отношения времени жизни, которые лучше всего моделируются как совместное владение. Это совсем не то же самое, что «у меня есть объекты, уходящие перед их указателями, поэтому я должен попробовать общий указатель!» У вас есть проблема с жизненным циклом объекта. Вы пытаетесь использовать общий указатель. Теперь у вас есть две проблемы: первоначальная проблема с жизненным сроком объекта и проблема с общим указателем.
Обратные вызовы - пример случая, когда вам нужны строгие правила жизни. Как долго вы звоните? Когда вы остановитесь? Как срочно вы перерабатываете ресурсы? Как вы отменили регистрацию обратного вызова? И т. Д.
Я написал системы обратного вызова, которые используют общие и слабые указатели. Они не идеальны. Вот один, который я нашел в google: broadcaster. Слушатель хранит токены, чтобы сказать «продолжайте говорить со мной», когда они уходят, вещатель останавливается на нем.
Можете ли вы опубликовать фрагмент кода? –
Вы можете наследовать от 'std :: enable_shared_from_this', использовать' shared_from_this() ', чтобы получить общий указатель и либо захватить' std :: shared_ptr'if, что вы хотите быть уверены, что объект все еще жив, или 'std: : weak_ptr', если вы хотите проверить, жив ли он или нет, чтобы выполнить какую-либо операцию. – skypjack
Я сделаю то, что @TheEyesightDim.Можем ли мы получить [mcve]? – user4581301