[c++11]weak_ptr

参考:How to: Create and Use weak_ptr Instances

weak_ptr是为了避免shared_ptr出现循环引用(cyclic reference)问题而设计的

weak_ptr实例本身不拥有内存资源,它只能指向shared_ptr实例保存的共享资源,所以本身不参与引用计数,因此它不能防止引用计数变为零。使用weak_ptr实例时,需要先转换成shared_ptr实例,再进行访问;当引用计数为0时,内存会被删除,此时调用weak_ptr有可能会引发bad_weak_ptr异常

weak_ptr类似于Java的弱引用,一方面能够保证避免循环引用问题,另一方面能够保证资源及时销毁,避免内存泄漏

成员函数

  • expired:是否weak_ptr对象为空或者和它相关的shared_ptr对象不存在
  • lock:返回一个shared_ptr对象,如果weak_ptr已经失效(expired),返回一个空指针的shared_ptr
  • use_countweak_ptr对象所属的shared_ptr的引用计数
  • reset:设置weak_ptr对象为空
  • swap:交换两个weak_ptr对象的内容,包括所属组

创建

template<typename T>
struct array_deleter {
    void operator()(T const *p) {
        delete[] p;
    }
};

int main() {
    // 创建整型数组
    std::shared_ptr<int> ints(new int[10], array_deleter<int>());
    for (int i = 0; i < 5; i++) {
        ints.get()[i] = i;
    }

    // 创建weak_ptr
    std::weak_ptr<int> wints(ints);

    cout << wints.use_count() << endl;
    cout << wints.expired() << endl;

    auto sptr = wints.lock();
    for (int i = 0; i < 5; i++) {
        cout << sptr.get()[i] << endl;
    }
}