std::weak_ptr<T>:: lock
| 
 | 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
| 
                
                 
                  
                   weak_ptr::lock
                  
                 
                
                | ||||
| 
                
                 
                  
                   (C++26)
                  
                 
                
                | ||||
| 
                
                 
                  
                   (C++26)
                  
                 
                
                | ||||
| Non-member functions | ||||
| Helper classes | ||||
| 
                
                 
                  
                   (C++20)
                  
                 
                
                | ||||
| Deduction guides (C++17) | 
| 
           
            
             
              std::
              
               shared_ptr
              
             
            
            
             <
            
            T
            
             >
            
            lock
            
             (
            
            
             )
            
            
             const
            
            
             noexcept
            
            
             ;
            
           
           | (since C++11) | |
       Creates a new
       
        
         std::shared_ptr
        
       
       that shares ownership of the managed object. If there is no managed object, i.e.
       
        
         
          *
         
         this
        
       
       is empty, then the returned
       
        shared_ptr
       
       also is empty.
      
Effectively returns expired ( ) ? shared_ptr < T > ( ) : shared_ptr < T > ( * this ) , executed atomically.
Parameters
(none)
Return value
       A
       
        shared_ptr
       
       which shares ownership of the owned object if
       
        
         std::weak_ptr::expired
        
       
       returns
       
        
         
          false
         
        
       
       . Else returns default-constructed
       
        shared_ptr
       
       of type
       
        T
       
       .
      
Notes
       Both this function and the constructor of
       
        
         std::shared_ptr
        
       
       may be used to acquire temporary ownership of the managed object referred to by a
       
        std::weak_ptr
       
       . The difference is that the constructor of
       
        
         std::shared_ptr
        
       
       throws an exception when its
       
        std::weak_ptr
       
       argument is empty, while
       
        std::weak_ptr<T>::lock()
       
       constructs an empty
       
        std::shared_ptr<T>
       
       .
      
Example
#include <iostream> #include <memory> void observe(std::weak_ptr<int> weak) { if (auto p = weak.lock()) std::cout << "\tobserve() is able to lock weak_ptr<>, value=" << *p << '\n'; else std::cout << "\tobserve() is unable to lock weak_ptr<>\n"; } int main() { std::weak_ptr<int> weak; std::cout << "weak_ptr<> is not yet initialized\n"; observe(weak); { auto shared = std::make_shared<int>(42); weak = shared; std::cout << "weak_ptr<> is initialized with shared_ptr\n"; observe(weak); } std::cout << "shared_ptr<> has been destructed due to scope exit\n"; observe(weak); }
Output:
weak_ptr<> is not yet initialized
        observe() is unable to lock weak_ptr<>
weak_ptr<> is initialized with shared_ptr
        observe() is able to lock weak_ptr<>, value=42
shared_ptr<> has been destructed due to scope exit
        observe() is unable to lock weak_ptr<>
        Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior | 
|---|---|---|---|
| LWG 2316 | C++11 | lock() was not required to be atomic, but required to be noexcept, which led to a contradiction | specified to be atomic | 
See also
| checks whether the referenced object was already deleted (public member function) |