What is the difference between an empty and a null std::shared_ptr in C++?

前端 未结 2 1310
隐瞒了意图╮
隐瞒了意图╮ 2020-12-02 06:37

The cplusplus.com shared_ptr page calls out a distinction between an empty std::shared_ptr and a null shared_ptr. The cppreferenc

2条回答
  •  春和景丽
    2020-12-02 07:30

    It's a weird corner of shared_ptr behavior. It has a constructor that allows you to make a shared_ptr that owns something and points to something else:

    template< class Y > 
    shared_ptr( const shared_ptr& r, T *ptr );
    

    The shared_ptr constructed using this constructor shares ownership with r, but points to whatever ptr points to (i.e., calling get() or operator->() will return ptr). This is handy for cases where ptr points to a subobject (e.g., a data member) of the object owned by r.

    The page you linked calls a shared_ptr that owns nothing empty, and a shared_ptr that points to nothing (i.e., whose get() == nullptr) null. (Empty is used in this sense by the standard; null isn't.) You can construct a null-but-not-empty shared_ptr, but it won't be very useful. An empty-but-not-null shared_ptr is essentially a non-owning pointer, which can be used to do some weird things like passing a pointer to something allocated on the stack to a function expecting a shared_ptr (but I'd suggest punching whoever put shared_ptr inside the API first).

    boost::shared_ptr also has this constructor, which they call the aliasing constructor.

提交回复
热议问题