为什么要使用smartpointers?

-8 c++ smart-pointers

特别是当智能指针很好用时,为什么还要使用智能指针,如果不鼓励使用C++中的指针?举个例子:

class Object {  }

smart_pointer < Object > pInstance;
//wherein I can use the very simple way
Object instance;
Run Code Online (Sandbox Code Playgroud)

Bar*_*icz 5

当您需要维护对象的所有权时,智能指针很好.使用它们将确保适当的破坏.当指针被视为参考时,使用智能指针有时会更糟(例如,在性能方面).

指针是C++的一个重要组成部分,但使用它们变得更容易,因为C++ 11中的智能引入了移动语义(基本上unique_ptr可以实现).这就是为什么在现代代码中你应该总是使用std::unique_ptr或者std::shared_ptr如果可用的话.


编辑:你问了一个例子,指针可能有利于使用.我能想到的最常见的问题是某个系统的可选组件.该组件将使用大量内存,因此您不希望始终分配它,也不要控制其分配(因此它本身不能处于"空"状态,即不可为空).Boost.Optional和C++ 14-ish std::optional分配TOD 的POD-ish大小的内存,所以他们不会这样做.使用指针,您可以选择分配该内存:

class Outer { 
    std::unique_ptr<BigInner> optionalComponent;
public:
    void initializeOptionalComponent() { 
        optionalComponent = new BigInner();
    }
    void useOptionalComponent() {
        if (!optionalComponent)
            // handle the error
        // operate
    } 
};
Run Code Online (Sandbox Code Playgroud)

这将解决问题,但会引入明显的另一个问题:optionalComponent可以为null,这要求所有使用它的函数始终检查有效状态.如果它是一个简单的按价值成员,它将(或至少应该)始终处于有效状态.因此,如果您不需要指针,请不要使用它,使用vector<MyClass>和普通成员.

无论如何,在这种情况下使用智能指针可以让你保持零规则; 您不必编写析构函数,复制构造函数或赋值运算符,该类将安全地运行.