C++ shared_ptr与weak_ptr结合使用的例子

shared_ptr

  • 描述
    shared_ptr采用引用计数,指针之间共享内存,传递一次引用就加1,引用数为0时自动销毁内存

weak_ptr

  • 描述
    weak_ptr为弱引用指针,主要用来辅助shared_ptr的使用,给它赋值不会增加引用计数,有时候不得不两者一起用,看下面一个例子。

example

假如我们有这样一个需求:用户需要几个API算法接口一起工作(比如处理多个视频,每个视频的操作是一样的),算法又比较耗时,需要在后台工作。这时,我们会这样操作:
API------>全局检测器------->返回结果给对应API。大概会用到下面几个模块:

//任务接收器
class TaskRecevier{
public:
  void onTaskDone(int result){printf("result%d\n",result);}
}
//任务结构
struct Task{
std::weak_ptr<TaskReceiver> receiver;
int result;
}
//给用户调用的API
class API{
public:
...
std::shared_ptr<TaskRecevier> receiver;
GlobalWorker* worker;
void doTask(int a);
}
//全局后台工作类
class GlobalWorker{
public:
   void doTask(std::weak_ptr<TaskRecevier> receiver,int a);
}

我们注意到API中的receiver是shared_ptr,算法接口参数是weak_ptr。这样做的目的是:算法在后台执行,当返回结果的时候,API可能已经被释放了,此时用weak_ptr.lock()返回的是空指针。如果这边用了shared_ptr,引用计数会加1,即使API被释放了,receiver依然没有被释放,会继续返回结果,一般会发生崩溃。如果这边用了一般的指针,比如shared_ptr.get()获得一个对象指针,比用shared_ptr还惨,直接调recevier的时候就挂掉了,因为API释放的时候,receiver引用计数为0已经释放了,此时算法拿到的receiver指针变成了野指针。所以,用shared_ptr存数据,weak_ptr传递,在上面这个例子中是最好用。

Guess you like

Origin blog.csdn.net/qq_16952303/article/details/84872880