智能指针(Smart Pointers)是一种用于管理动态分配的内存的对象。它们可以自动处理资源的释放,从而减少内存泄漏的风险。最常见的智能指针类型有std::unique_ptr和std::shared_ptr。
unique_ptr是一种独占所有权的智能指针。一个unique_ptr是唯一指向一块内存的所有者,当unique_ptr超出作用域或被显式地释放时,内存会被自动释放。
(相关资料图)
Case:
shared_ptr是一种共享所有权的智能指针。多个shared_ptr可以指向同一块内存,并且会跟踪有多少个指针指向该内存(引用计数)。只有当最后一个指向该内存的shared_ptr被销毁时,内存才会被释放。
Case:
如果使用new关键字来创建shared_ptr,会导致更大的内存开销。因为new关键字分配了两个独立的内存块,一个用于存储对象,另一个用于存储引用计数(即shared_ptr的数量),而且在释放内存的时候也要分别释放两块内存。而make_shared函数将对象和引用计数存储在同一块内存中,避免了额外的内存分配。
但是shared_ptr有一个潜在的问题——循环引用。循环引用指的是两个或多个对象相互持有对方的shared_ptr,导致它们的引用计数永远不会变为零,从而无法释放内存。
Case:
std::weak_ptr也是一种智能指针,用于解决shared_ptr可能出现的循环引用问题。 weak_ptr允许创建一个指向shared_ptr所管理对象的非拥有引用。weak_ptr是一种弱引用,它允许观察由shared_ptr管理的对象,而不会增加引用计数。换句话说,weak_ptr不会影响对象的生命周期。
weak_ptr的创建只能通过shared_ptr的赋值来实现。可以使用weak_ptr的成员函数lock来获得指向所管理对象的shared_ptr强引用,它返回一个有效的shared_ptr,如果对象已被销毁,则返回空的shared_ptr。
weak_ptr还提供了一个成员函数expired,用于检查弱引用指向的对象是否已经被销毁。如果对象已销毁,则返回true,否则返回false。
Copyright © 2015-2022 今日上海网版权所有 备案号:京ICP备2022022245号-14 联系邮箱:435 226 40@qq.com