table of contents
        
      
      
    - Tumbleweed 2024.07.05-1.3
 - Leap-16.0
 - Leap-15.6
 
| std::allocate_shared,std::allocate_shared_for_overwrite(3) | C++ Standard Libary | std::allocate_shared,std::allocate_shared_for_overwrite(3) | 
NAME¶
std::allocate_shared,std::allocate_shared_for_overwrite - std::allocate_shared,std::allocate_shared_for_overwrite
Synopsis¶
 Defined in header <memory>
  
   template< class T, class Alloc, class... Args > (since C++11)
  
   shared_ptr<T> allocate_shared( const Alloc& alloc,
    Args&&... (1) (T is non-array)
  
   args );
  
   template< class T, class Alloc > (since C++20)
  
   shared_ptr<T> allocate_shared( const Alloc& alloc, std::size_t
    (2) (T is U[])
  
   N );
  
   template< class T, class Alloc > (3) (since C++20)
  
   shared_ptr<T> allocate_shared( const Alloc& alloc ); (T is U[N])
  
   template< class T, class Alloc >
  
   shared_ptr<T> allocate_shared( const Alloc& alloc, std::size_t
    (since C++20)
  
   N, (4) (T is U[])
  
   const std::remove_extent_t<T>& u
  
   );
  
   template< class T, class Alloc >
  
   shared_ptr<T> allocate_shared( const Alloc& alloc, (5)
    (since C++20)
  
   (T is U[N])
  
   const std::remove_extent_t<T>& u
  
   );
  
   template< class T, class Alloc > (since C++20)
  
   shared_ptr<T> allocate_shared_for_overwrite( const Alloc& alloc
    (6) (T is not U[])
  
   );
  
   template< class T, class Alloc > (since C++20)
  
   shared_ptr<T> allocate_shared_for_overwrite( const Alloc&
    (7) (T is U[])
  
   alloc, std::size_t N );
  
   1) Constructs an object of type T and wraps it in a std::shared_ptr using
    args as
  
   the parameter list for the constructor of T. The object is constructed as if
    by the
  
   expression
  
   ::new (pv) T(v)
  
   (until C++20)
  
   std::allocator_traits<A2>::construct(a, pv, v)
  
   (since C++20), where pv is an internal void* pointer to storage
    suitable to hold an
  
   object of type T and a is a copy of the allocator rebound to
    std::remove_cv_t<T>.
  
   The storage is typically larger than sizeof(T) in order to use one allocation
    for
  
   both the control block of the shared pointer and the T object. The
    std::shared_ptr
  
   constructor called by this function enables shared_from_this with a pointer
    to the
  
   newly constructed object of type T. All memory allocation is done using a
    copy of
  
   alloc, which must satisfy the Allocator requirements. This overload
    participates in
  
   overload resolution only if T is not an array type.
  
   2,3) Same as (1), but the object constructed is a
    possibly-multidimensional array
  
   whose every non-array element is initialized as if by the expression
  
   std::allocator_traits<A2>::construct(a2, pv) where a2 of type A2 is the
    copy of the
  
   allocator rebound to manage objects of type
  
   std::remove_cv_t<std::remove_all_extents_t<T>>. The overload
    (2) creates an array of
  
   size N along its first dimension. The array elements are initialized in
    ascending
  
   order of their addresses, and when their lifetime ends are destroyed in the
    reverse
  
   order of their original construction.
  
   4,5) Same as (2,3), but the elements of the array are initialized from the
    default
  
   value u. If std::remove_extent_t<T> is not itself an array type, then
    this is
  
   performed as if by the same allocator expression as in (1), except
    that the
  
   allocator is rebound to the
    std::remove_cv_t<std::remove_all_extents_t<T>>.
  
   Otherwise, this is performed as if by initializing every non-array element of
    the
  
   (possibly multidimensional) array with the corresponding element from u using
    the
  
   same allocator expression as in (1), except that the allocator is
    rebound to the
  
   type std::remove_cv_t<std::remove_all_extents_t<T>>. The overload
    (4) creates an
  
   array of size N along the first dimension. The array elements are initialized
    in
  
   ascending order of their addresses, and when their lifetime ends are
    destroyed in
  
   the reverse order of their original construction.
  
   6) Same as (1) if T is not an array type and (3) if T is U[N],
    except that the
  
   created object is default-initialized.
  
   7) Same as (2), except that the individual array elements are
    default-initialized.
  
   For allocate_shared, the object
  
   (or the individual array elements for (2-5))
  
   (since C++20) are destroyed via the expression
    std::allocator_traits<A2>::destroy(a,
  
   p), where p is a pointer to the object and a is a copy of the allocator
    passed to
  
   allocate_shared, rebound to the type of the object being destroyed.
  
   For allocate_shared_for_overwrite, the object (or individual elements
  
   if T is an array type) will be destroyed by p->~X(), where p is a
    (since C++20)
  
   pointer to the object and X is its type.
Parameters¶
 alloc - the Allocator to use
  
   args... - list of arguments with which an instance of T will be constructed
  
   N - array size to use
  
   u - the initial value to initialize every element of the array
Return value¶
std::shared_ptr of an instance of type T.
Exceptions¶
 Can throw the exceptions thrown from Alloc::allocate() or from
    the constructor of T.
  
   If an exception is thrown, (1) has no effect.
  
   If an exception is thrown during the construction of the array,
    already-initialized
  
   elements are destroyed in reverse order
  
   (since C++20).
Notes¶
 Like std::make_shared, this function typically performs only one
    allocation, and
  
   places both the T object and the control block in the allocated memory block
    (the
  
   standard recommends but does not require this, all known implementations do
    this). A
  
   copy of alloc is stored as part of the control block so that it can be used
    to
  
   deallocate it once both shared and weak reference counts reach zero.
  
   Unlike the std::shared_ptr constructors, std::allocate_shared does not accept
    a
  
   separate custom deleter: the supplied allocator is used for destruction of
    the
  
   control block and the T object, and for deallocation of their shared memory
    block.
  
   std::shared_ptr supports array types (as of C++17), but
  
   std::allocate_shared does not. This functionality is supported by (until
    C++20)
  
   boost::allocate_shared.
  
   A constructor enables shared_from_this with a pointer ptr of type U* means
    that it
  
   determines if U has an
  
   unambiguous and accessible
  
   (since C++17) base class that is a specialization of
    std::enable_shared_from_this,
  
   and if so, the constructor evaluates the statement:
  
   if (ptr != nullptr && ptr->weak_this.expired())
  
   ptr->weak_this = std::shared_ptr<std::remove_cv_t<U>>(
  
   *this, const_cast<std::remove_cv_t<U>*>(ptr));
  
   Where weak_this is the hidden mutable std::weak_ptr member of
  
   std::enable_shared_from_this. The assignment to the weak_this member is not
    atomic
  
   and conflicts with any potentially concurrent access to the same object. This
  
   ensures that future calls to shared_from_this() would share ownership with
    the
  
   std::shared_ptr created by this raw pointer constructor.
  
   The test ptr->weak_this.expired() in the exposition code above makes sure
    that
  
   weak_this is not reassigned if it already indicates an owner. This test is
    required
  
   as of C++17.
  
   Feature-test macro Value Std Feature
  
   Smart pointer creation with default
  
   initialization
  
   __cpp_lib_smart_ptr_for_overwrite 202002L (C++20)
    (std::allocate_shared_for_overwrite,
  
   std::make_shared_for_overwrite,
  
   std::make_unique_for_overwrite);
  
   overloads (6,7)
Example¶
 This section is incomplete
  
   Reason: no example
See also¶
 constructor constructs new shared_ptr
  
   (public member function)
  
   make_shared creates a shared pointer that manages a new object
  
   make_shared_for_overwrite (function template)
  
   (C++20)
Category:¶
* Todo no example
| 2024.06.10 | http://cppreference.com |