# std::pmr::set_default_resource

From cppreference.com
< cpp‎ | memory

Defined in header `<memory_resource>` |  |
std::pmr::memory_resource * set_default_resource( std::pmr::memory_resource * r ) noexcept; |  | (since C++17)

If r is not null, sets the default memory resource pointer to r; otherwise, sets the default memory resource pointer to std::pmr::new_delete_resource ().

The default memory resource pointer is used by certain facilities when an explicit memory resource is not supplied. The initial default memory resource pointer is the return value of std::pmr::new_delete_resource.

This function is thread-safe. Every call to `std::pmr::set_default_resource` synchronizes with (see std::memory_order) the subsequent `std::pmr::set_default_resource` and std::pmr::get_default_resource calls.

### Return value

Returns the previous value of the default memory resource pointer.

### Example

Run this code

    #include <array>
    #include <cstddef>
    #include <cstdint>
    #include <iostream>
    #include <iterator>
    #include <memory_resource>
    #include <vector>

    class noisy_allocator : public std::pmr::memory_resource
    {
        void* do_allocate(std::size_t bytes, std::size_t alignment) override
        {
            std::cout << "+ Allocating " << bytes << " bytes @ ";
            void* p = std::pmr::new_delete_resource()->allocate(bytes, alignment);
            std::cout << p << '\n';
            return p;
        }

        void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override
        {
            std::cout << "- Deallocating " << bytes << " bytes @ " << p << '\n';
            return std::pmr::new_delete_resource()->deallocate(p, bytes, alignment);
        }

        bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override
        {
            return std::pmr::new_delete_resource()->is_equal(other);
        }
    };

    int main()
    {
        constexpr int push_back_limit{16};
        noisy_allocator mem;
        std::pmr::set_default_resource(&mem);

        {
            std::cout << "Entering scope #1 (without buffer on stack)...\n";
            std::cout << "Creating vector v...\n";
            std::pmr::vector<std::uint16_t> v{1, 2, 3, 4};
            std::cout << "v.data() @ " << v.data() << '\n';

            std::cout << "Requesting more...\n";
            for (int i{0}; i != push_back_limit; ++i)
            {
                v.push_back(i);
                std::cout << "v.size(): " << v.size() << '\n';
            }
            std::cout << "Exiting scope #1...\n";
        }

        std::cout << '\n';

        {
            std::cout << "Entering scope #2 (with buffer on stack)...\n";

            std::uint8_t buffer[16];
            std::cout << "Allocating buffer on stack: " << sizeof buffer << " bytes @ "
                      << static_cast<void*>(buffer) << '\n';
            std::pmr::monotonic_buffer_resource mem_res{std::data(buffer), std::size(buffer)};

            std::cout << "Creating vector v...\n";
            std::pmr::vector<std::uint16_t> v{{1, 2, 3, 4}, &mem_res};
            std::cout << "v.data() @ " << v.data() << '\n'; // equals to `buffer` address

            std::cout << "Requesting more...\n";
            for (int i{0}; i != push_back_limit; ++i)
            {
                v.push_back(i);
                std::cout << "v.size(): " << v.size() << '\n';
            }
            std::cout << "Exiting scope #2...\n";
        }
    }

Possible output:

    Entering scope #1 (without buffer on stack)...
    Creating vector v...
    + Allocating 8 bytes @ 0x1f75c30
    v.data() @ 0x1f75c30
    Requesting more...
    + Allocating 16 bytes @ 0x1f75c50
    - Deallocating 8 bytes @ 0x1f75c30
    v.size(): 5
    v.size(): 6
    v.size(): 7
    v.size(): 8
    + Allocating 32 bytes @ 0x1f75c70
    - Deallocating 16 bytes @ 0x1f75c50
    v.size(): 9
    v.size(): 10
    v.size(): 11
    v.size(): 12
    v.size(): 13
    v.size(): 14
    v.size(): 15
    v.size(): 16
    + Allocating 64 bytes @ 0x1f75ca0
    - Deallocating 32 bytes @ 0x1f75c70
    v.size(): 17
    v.size(): 18
    v.size(): 19
    v.size(): 20
    Exiting scope #1...
    - Deallocating 64 bytes @ 0x1f75ca0

    Entering scope #2 (with buffer on stack)...
    Allocating buffer on stack: 16 bytes @ 0x7fffbe9f8240
    Creating vector v...
    v.data() @ 0x7fffbe9f8240
    Requesting more...
    + Allocating 64 bytes @ 0x1f75ca0
    v.size(): 5
    v.size(): 6
    v.size(): 7
    v.size(): 8
    v.size(): 9
    v.size(): 10
    v.size(): 11
    v.size(): 12
    v.size(): 13
    v.size(): 14
    v.size(): 15
    v.size(): 16
    + Allocating 128 bytes @ 0x1f75cf0
    v.size(): 17
    v.size(): 18
    v.size(): 19
    v.size(): 20
    Exiting scope #2...
    - Deallocating 128 bytes @ 0x1f75cf0
    - Deallocating 64 bytes @ 0x1f75ca0

### See also

get_default_resource (C++17) | gets the default std::pmr::memory_resource (function)
new_delete_resource (C++17) | returns a static program-wide std::pmr::memory_resource that uses the global operator new and operator delete to allocate and deallocate memory (function)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/memory/set_default_resource&oldid=160465"