可以检查所指向的对象是否仍然存活(未被删除)。 通过调用lock()方法临时获取一个可访问对象的shared_ptr,如果对象已被删除,则返回空shared_ptr。 成员函数: expired():返回对象是否已被删除(即引用计数是否为零)。 lock():尝试获取一个指向对象的shared_ptr,如果对象仍然有效,则返回非空shared_ptr,否则返回空share...
在这个例子中,A和B使用std::weak_ptr互相引用,这样就不会增加引用计数,从而避免了循环引用的问题。std::weak_ptr的lock()方法会尝试返回一个有效的std::shared_ptr,如果对象已经被释放,则返回空的std::shared_ptr,这样可以安全地检查对象是否有效。 5.std::shared_ptr的线程安全性 std::shared_ptr提供了基本...
expired 检查是否shared_ptr所管理的资源已经被删除 lock 生成一个shared_ptr 关于具体示例可参考std::weak_ptr - cppreference.com 本文从如下代码示例讲解weak_ptr的具体工作原理 #include<iostream>#include<memory>intmain(){autop=std::shared_ptr<int>(newint(4));// int num{10};// auto p1 = std:...
lock()->powerOn(); if (!b.expired()) b.lock()->powerOn(); if (!c.expired()) c.lock()->powerOn(); return 0; } 代码如上所述: 和正常情况下我们判断一个指针是否为空类似, 我们使用expired()判断weak_ptr指针是否还能使用. 如果可以使用, 我们使用lock临时获取指针的所有权, 然后进行操作...
weak_ptr对象引用资源时不会增加引用计数,但是它能够通过lock()方法来判断它所管理的资源是否被释放。另外很自然地一个问题是:既然weak_ptr不增加资源的引用计数,那么在使用weak_ptr对象的时候,资源被突然释放了怎么办呢?呵呵,答案是你根本不能直接通过weak_ptr来访问资源。那么如何通过weak_ptr来间接访问资源呢?
weak_ptr对象引用资源时不会增加引用计数,但是它能够通过lock()方法来判断它所管理的资源是否被释放。另外很自然地一个问题是:既然weak_ptr不增加资源的引用计数,那么在使用weak_ptr对象的时候,资源被突然释放了怎么办呢?呵呵,答案是你根本不能直接通过weak_ptr来访问资源。那么如何通过weak_ptr来间接访问资源呢?
我们可以通过调用 std::weak_ptr 的 lock() 方法获得一个指向对象的 shared_ptr,如果对象已经被释放,则返回一个空的 shared_ptr。通过使用 std::weak_ptr,我们可以将循环引用中的某些引用改为弱引用,从而打破循环引用。 预先声明类B 在上面的示例中,类 A 持有类 B 的 shared_ptr,而类 B 持有类 A 的 ...
weak_ptr,顾名思义,是一个 “弱” 一点的智能指针,它不会增加引用计数,当你需要使用这个对象的时候,可以从 weak_ptr 临时生出一个 shared_ptr 来 (通过 lock 函数),这个临时的 shared_ptr 生命结束以后,就会把引用计数减小 1,这样就不会出现互相死锁的情况了。
std::shared_ptr<int> ptr = std::make_shared<int>(100); std::mutex mt; for (auto i= 0; i<10; i++){ std::thread([&ptr, &mt]{ std::scoped_lock lock(mt); ptr = std::make_shared<int>(200); //... }).detach(); } 原子函数: std::shared_ptr<int> ptr = std::make...
weak_ptr对象引用资源时不会增加引用计数,但是它能够通过lock()方法来判断它所管理的资源是否被释放。另外很自然地一个问题是:既然weak_ptr不增加资源的引用计数,那么在使用weak_ptr对象的时候,资源被突然释放了怎么办呢?呵呵,答案是你根本不能直接通过weak_ptr来访问资源。那么如何通过weak_ptr来间接访问资源呢?