我来自 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 的一个很好的理由,还是有一个干净的方法来解决这个问题?
更新
ApplicationService 是一个类,它是与我的代码使用的第 3 方库交互所需的全局函数的包装器。我有这门课,因为我相信这是支持单元测试和独立功能的存根/模拟的标准方法。此类只是将调用委托给相应的全局函数。调用 appService_.Destroy(something); 实际上是在破坏 MyClass 的每个特定实例使用的对象,而不是破坏与 Application 类本身有关的任何事情。