c++中的自动指针和共享指针有什么区别?
What is the difference between auto pointers and shared pointers in C++
我听说自动指针拥有自己的对象,而共享指针可以有许多对象指向它们。我们为什么不一直使用共享指针呢?
关于什么是智能指针,人们将这个术语与共享指针互换使用。它们是一样的吗?
std::auto_ptr
是一个过时的,弃用的独占指针所有权实现。它在c++ 11中被std::unique_ptr
所取代。独占所有权意味着指针为某物所有,对象的生命周期与所有者的生命周期相关联。
共享指针(std::shared_ptr
)实现了共享指针所有权——只要有对它的有效引用,它们就保持对象的存活,因为没有单一的所有者。这通常是通过引用计数完成的,这意味着与唯一指针相比,它们有额外的运行时开销。此外,关于共享所有权的推理比关于独占所有权的推理更困难——破坏点变得不那么确定。
智能指针是一个术语,它包含了所有表现得像指针的类型,但是添加了(智能)语义,与原始的T*
相反。unique_ptr
和shared_ptr
都是智能指针
共享指针的开销略高,因为它们持有引用计数。在某些情况下,如果您有一个在多个递归级别上具有共享指针的复杂结构,那么一个更改可能会触及许多这些指针的引用计数。
同样,在多CPU核心架构中,如果多个核心当前访问相同的内存区域,那么引用计数的原子更新至少可能会变得非常昂贵,但实际上非常昂贵。
然而,共享指针使用起来既简单又安全,而自动指针的赋值属性却令人困惑,而且可能变得非常危险。
智能指针通常被频繁地用作共享指针的同义词,但实际上涵盖了boost中所有不同的指针实现,包括与共享指针类似的指针。
智能指针有很多种形式。Boost启发的shared_ptr就是其中之一,它现在在c++ 11中。我建议在几乎所有有疑问的地方使用shared_ptr,而不是auto_ptr,因为auto_ptr有很多怪癖。
简而言之,shared_ptr只是一个引用计数实现来共享同一个对象。
参考:http://www.gotw.ca/publications/using_auto_ptr_effectively.htmhttp://en.cppreference.com/w/cpp/memory/shared_ptr
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 将指针分配给另一个指针时会发生什么情况?
- 当该数组的索引中没有元素时,指针指向什么?
- C++:Lambda 函数指针转换的用例是什么?
- C++关于指针和使用函数将它们启动到堆的行为究竟是什么?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 以下与指针相关的代码的输出是什么?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- C++中的指针.什么类型的对象