简短版本:
在现代 C++ 中使用非智能指针是否有任何可接受的理由?
简短的回答:
当然,如果他们只是用于观察,也就是说,他们不拥有指针。但是,即使在这种情况下,也要尝试使用引用而不是指针;仅当您确实需要使它们成为可选时才使用指针(null_ptr
例如,使用然后重新分配初始化)。
长版:
我们有一个包含大量旧 C++ 代码的庞大产品,现在我们正试图将其重构到现代 C++ 时代。[...]
长答案:
当我阅读这些行时,我想到了这个答案:
我希望我能不止一次地支持这个答案。我会引用:“[...] 对于我们所做的每一个重构因素,我们都可以证明‘这个特定的改变将使我们现在正在做的实际任务更容易’。而不是‘这对于未来的工作来说现在更清洁了’。”
长话短说,除非你真的需要,否则不要进行大的重构。
所以问题是:是否存在过度使用智能指针这样的事情?
在我看来,std::shared_ptr
是过度使用。它使用起来非常舒适,它给您一种无需考虑所有权问题的错觉。但这还不是全部。我完全同意Sean Parent的观点:“共享指针与全局变量一样好。” 共享指针还会引入非常困难的所有权问题等。
另一方面,如果您需要在堆上分配一些东西,请使用unique_ptr
. 如果你真的需要堆分配,你不能过度使用它。以我的经验,使用unique_ptr
也可以使代码更清晰、更容易理解,因为所有权问题变得不言自明。
Sean Parent 就如何避免/减少指针的使用进行了有趣的讨论:
希望这可以帮助。