shared_ptr类中get()成员的用途是什么?

6

我的问题是,shared_ptr类的get()成员有哪些不同的用法?为什么不能使用< strong > delete < /strong >来删除它?


4
当您需要访问受管理的原始指针时,请使用get()。如果您执行delete sp.get();,则很可能会得到未定义的行为,这是当之无愧的结果。 - Praetorian
1
使用需要原始指针的API - Severin Pappadeux
1
这让我想起了很久以前(在boost::shared_ptr之前),当我自己编写引用计数指针时。我将原始指针访问器命名为'very_bad_public_method'。 - Gretchen
2个回答

12
如果你有一个接受原始指针的函数
void f(T *t); // non-owning pointer

如果你有一个指向T对象的智能指针,你可以通过使用get()将它传递给该函数。
std::shared_ptr<T> sp{new T{}};  // or unique_ptr
//f(sp); // no good, type mismatch
f(sp.get()); // passes the raw pointer instead

使用原始指针的API很常见,而且仍然有用。我建议你观看CppCon 2014中Herb Sutter的演讲的这部分链接,可能还要看看周围的部分。

不应该尝试删除这个指针,智能指针类假设你不会做任何这样的事情,当时机到来时,智能指针仍然会在自己的析构函数中释放被管理的对象(毕竟,它怎么知道你已经删除了它?)。

智能指针的工作是管理对象并在适当的时候删除它,如果你想手动管理对象的生命周期(通常不推荐),那就使用原始指针。

如果你确实想要承担unique_ptr的所有权,可以通过调用release()来实现。


Boost还提到,由于您可以为共享指针使用自定义删除器,因此即使它是唯一拥有的,通过原始指针释放对象也不是微不足道的。 - dyp

4
通常情况下,当你需要向接受原始指针的API传递指针时,应该使用get()shared_ptr类管理指针的所有权,因此当智能指针的生命周期结束时,它将自动删除所拥有的内存。如果你试图手动删除内存,那么当shared_ptr尝试去释放时会导致未定义行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接