Я прихожу с C # и пытаюсь перевести некоторые из моих практик на C ++. Я использовал внедрение зависимостей в разных местах своего кода, используя необработанные указатели. Затем я решаю заменить необработанные указатели на std :: shared_ptr. В рамках этого процесса было предложено рассмотреть возможность использования автоматических переменных, выделяемых стеком, а не их динамического выделения (см. этот вопрос , хотя этот вопрос был в контексте unique_ptr, так что, возможно, это другое).
Я считаю, что в приведенном ниже примере показано использование автоматических переменных.
class MyClass
{
public:
MyClass(ApplicationService& app): appService_(app)
{
}
~MyClass()
{
appService_.Destroy(something);
}
private:
ApplicationService& appService_;
}
class ConsumerClass
{
DoSomething()
{
CustomApplicationService customAppService;
MyClass myclass(customAppService);
myclass...
}
}
В приведенном выше примере, когда customAppservice и myclass выходят из области видимости, как мне узнать, что будет уничтожено первым? Если customAppService уничтожается первым, деструктор MyClass завершится ошибкой. Это хорошая причина использовать shared_ptr вместо этого в этом сценарии или есть чистый способ обойти это?
UPDATE
ApplicationService - это класс, который является оболочкой для глобальных функций, необходимых для взаимодействия со сторонней библиотекой, которую мой код использует. У меня есть этот класс, поскольку я считаю, что это стандартный способ поддержки модульного тестирования и создания заглушек / имитации автономных функций. Этот класс просто делегирует вызовы соответствующим глобальным функциям. Вызов appService_.Уничтожить (что-нибудь); фактически уничтожает объект, используемый каждым конкретным экземпляром MyClass, не уничтожая ничего, что связано с самим классом Application.