Namespaces
Variants
Views
Actions

std::get_temporary_buffer

From cppreference.com
< cpp‎ | memory
Revision as of 15:05, 26 October 2015 by T. Canens (Talk | contribs)

 
 
Utilities library
General utilities
Relational operators (deprecated in C++20)
 
Dynamic memory management
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Allocators
Garbage collection support
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)
(C++11)(until C++23)



Uninitialized storage
(until C++20*)
get_temporary_buffer
(until C++20*)
 
Defined in header <memory>
template< class T >
std::pair< T*, std::ptrdiff_t > get_temporary_buffer( std::ptrdiff_t count );

Allocates uninitialized contiguous storage, which should be sufficient to store up to count adjacent objects of type T. The request is non-binding and the implementation may allocate less or more than necessary to store count adjacent objects.

Contents

Parameters

count - the desired number of objects

Return value

An std::pair holding a pointer to the beginning of the allocated storage and the number of objects that fit in the storage that was actually allocated.

If no memory could be allocated, or allocated storage is not enough to store a single element of type T, the first element of the result is a null pointer and the second element is zero.

Exceptions

(none) (until C++11)
noexcept specification:  
noexcept
  
(since C++11)

Example

#include <algorithm>
#include <iostream>
#include <iterator>
#include <memory>
#include <string>
 
int main()
{
    const std::string s[] = {"string", "1", "test", "..."};
    const auto p = std::get_temporary_buffer<std::string>(4);
    // requires that p.first is passed to return_temporary_buffer
    // (beware of early exit points and exceptions), or better use:
    std::unique_ptr<std::string, void(*)(std::string*)> on_exit(p.first,
    [](std::string* p)
    {
        std::cout << "returning temporary buffer...\n";
        std::return_temporary_buffer(p);
    });
 
    std::copy(s, s + p.second,
              std::raw_storage_iterator<std::string*, std::string>(p.first));
    // has same effect as: std::uninitialized_copy(s, s + p.second, p.first);
    // requires that each string in p is individually destroyed
    // (beware of early exit points and exceptions)
 
    std::copy(p.first, p.first + p.second,
              std::ostream_iterator<std::string>{std::cout, "\n"});
 
    std::for_each(p.first, p.first + p.second, [](std::string& e)
    {
        e.~basic_string<char>();
    }); // same as: std::destroy(p.first, p.first + p.second);
 
    // manually reclaim memory if unique_ptr-like technique is not used:
    // std::return_temporary_buffer(p.first);
}

Output:

string
1
test
...
returning temporary buffer...

See also

(deprecated in C++17)(removed in C++20)
frees uninitialized storage
(function template) [edit]