shared_ptr的用法
发布网友
发布时间:2022-07-15 21:05
我来回答
共1个回答
热心网友
时间:2024-10-20 03:46
把对象直接存入容器中有时会有些麻烦。以值的方式保存对象意味着使用者将获得容器中的元素的拷贝,对于那些复制是一种昂贵的操作的类型来说可能会有性能的问题。此外,有些容器,特别是 std::vector, 当你加入元素时可能会复制所有元素,这更加重了性能的问题。最后,传值的语义意味着没有多态的行为。如果你需要在容器中存放多态的对象而且你不想切割它们,你必须用指针。如果你用裸指针,维护元素的完整性会非常复杂。从容器中删除元素时,你必须知道容器的使用者是否还在引用那些要删除的元素,不用担心多个使用者使用同一个元素。这些问题都可以用shared_ptr来解决。
下面是如何把共享指针存入标准库容器的例子。 #include boost/shared_ptr.hpp#include <vector>#include <iostream>class A {public: virtual void sing()=0; protected: virtual ~A() {};};class B : public A {public: virtual void sing() { std::cout << Do re mi fa so la; }};boost::shared_ptr<A> createA() { boost::shared_ptr<A> p(new B()); return p;}int main() { typedef std::vector<boost::shared_ptr<A> > container_type; typedef container_type::iterator iterator; container_type container; for (int i=0;i<10;++i) { container.push_back(createA()); } std::cout << The choir is gathered: \n; iterator end=container.end(); for (iterator it=container.begin();it!=end;++it) { (*it)->sing(); }} 这里有两个类, A和 B, 各有一个虚拟成员函数 sing. B从 A公有继承而来,并且如你所见,工厂函数 createA返回一个动态分配的B的实例,包装在shared_ptr<A>里。在 main里, 一个包含shared_ptr<A>的 std::vector被放入10个元素,最后对每个元素调用sing。如果我们用裸指针作为元素,那些对象需要被手工删除。而在这个例子里,删除是自动的,因为在vector的生存期中,每个shared_ptr的引用计数都保持为1;当 vector被销毁,所有引用计数器都将变为零,所有对象都被删除。有趣的是,即使 A的析构函数没有声明为 virtual, shared_ptr也会正确调用 B的析构函数!
上面的例子示范了一个强有力的技术,它涉及A里面的protected析构函数。因为函数 createA返回的是 shared_ptr<A>, 因此不可能对shared_ptr::get返回的指针调用 delete。这意味着如果为了向某个需要裸指针的函数传送裸指针而从shared_ptr中取出裸指针的话,它不会由于意外地被删除而导致灾难。那么,又是如何允许 shared_ptr删除它的对象的呢? 这是因为指针指向的真正类型是 B; 而B的析构函数不是protected的。这是非常有用的方法,用于给shared_ptr中的对象增加额外的安全性。
shared_ptr的应用场景以及使用注意事项
对象间共享数据,对象的创建与销毁相分离,这是shared_ptr的主要应用场景之一。它允许在不直接管理内存的情况下,实现资源的共享。当动态对象被放入容器时,使用shared_ptr进行包装会比unique_ptr更合适,因为它能处理对象的引用计数,自动管理内存,避免内存泄漏。在管理动态数组时,需要明确指定Deleter以支持...
shared_ptr用法
在C++中,shared_ptr的主要作用是解决多个对象共享资源的生命周期管理问题。以类A和B为例,它们共享一个int值。使用shared_ptr时,需要包含"boost/shared_ptr.hpp"库。在代码中,创建了两个类A和B,它们的构造函数都接收一个shared_ptr实例。这样,temp、a和b三个shared_ptr都指向同一个int。当所有...
关于c++的shared_ptr?
在C++编程中,共享智能指针shared_ptr是一种用于管理动态分配的内存资源的工具。它能够追踪对象的生命周期,确保当对象不再被需要时,内存能被正确释放,避免内存泄漏问题。其中,shared_ptr的核心功能在于共享被管理对象的所有权。当创建一个shared_ptr实例时,它会自动管理所指向的对象的生命周期。这意味着...
C++ : shared_ptr是线程安全的吗?
1. **拷贝shared_ptr**:拷贝过程中主要操作的是引用计数,而引用计数的更新是原子操作,确保了线程安全。例如,假设两个线程同时对同一个shared_ptr进行拷贝,无论操作多少次,引用计数始终为20001,这表明它是安全的。2. **修改内存区域**:然而,对shared_ptr指向的内存进行并发修改则不保证线程安全...
共享指针shared_ptr
共享指针shared_ptr是C++中一种智能指针,专门用于管理动态创建对象的生命周期。它的主要功能在于自动管理对象的销毁,以消除内存泄漏和悬空指针的问题。以下是shared_ptr的工作原理、特点和创建方法,以及常见错误的避免策略。共享原理与特点 共享指针通过引用计数机制来管理对象的生命周期。每当新的shared_ptr...
shared_ptr作用
shared_ptr是一种特殊的智能指针,其设计类似于普通指针,但它具有独特的引用计数功能。每当有一个shared_ptr指向某个对象时,该对象的引用计数就会增加。当引用计数变为0,意味着没有shared_ptr再指向该对象,此时,系统会自动删除这个对象,从而避免了非环形数据结构中常见的资源泄露问题。相比之下,传统...
shared_ptr的用法
<iostream>class A {public: virtual void sing()=0; protected: virtual ~A() {};};class B : public A {public: virtual void sing() { std::cout << Do re mi fa so la; }};boost::shared_ptr<A> createA() { boost::shared_ptr<A> p(new B()); ...
多线程访问shared_ptr需要加锁吗?(转)
shared_ptr 是一种引用计数型智能指针,用于管理堆上的对象生命周期,避免内存泄漏。其内部包含指向对象的指针 ptr 和引用计数 ref_count。ref_count 用于记录指向同一对象的 shared_ptr 的数量,当数量为 0 时,表示对象已被完全释放。在多线程环境下,若不加锁直接读写 shared_ptr,会导致竞态条件(...
C++智能指针的简单分析——shared_ptr和weak_ptr
shared_ptr的关键方法包括get()、use_count()、unique()、reset()和swap(ptr)等。注意事项尽管shared_ptr提供get()获取指针,但需谨慎使用,避免野指针。直接用指针构造shared_ptr可能导致资源重复删除,不建议。weak_ptr相比之下,weak_ptr更加简单,它不直接控制对象,仅作为shared_ptr的弱引用。使用...
C++11智能指针 shared_ptr、weak_ptr和unique_ptr详解
在共享引用相互关联的情境下,若不采取恰当措施如使用weak_ptr,可能会导致资源无法正常释放,例如两个shared_ptr相互引用时,会形成资源释放瓶颈,无法正常执行析构函数。引入weak_ptr机制后,如将一个shared_ptr转换为weak_ptr,或在构造时即为weak_ptr,可有效解除引用计数锁定,保障资源得以正确清理。un...