1. 问题陈述
在 一文详解C++11的三种智能指针中,我们详细探讨了C++11中提供的三种智能指针的应用场景以及shared_ptr的实现。今天需要探讨的是:shared_ptr的安全性。先上结论:不安全,需要加锁。
2. 过程剖析
在shared_ptr的实现中,需要在堆上开辟两块空间,一块用于指向裸指针、一块用于指向引用计数的对象。
假设现在对象a,类型为T,在主线程有个智能指针shared_ptr<T> G
指向了这个对象,此时引用计数为1。然后开启子线程执行,但是执行了一半,只完成子线程中裸指针的指向,而引用计数没来得及指向就切换了。因此,此时引用计数仍然为1:
在切回主线程后,智能指针G不再指向a了。此时引用计数为0,对象a被释放:
此时再切换回子线程,而a已经被释放,此时智能指针就变成了悬空指针了:
因此可以看见,对于智能指针,在多线程得环境下需要加锁使用。