C++ memory_resource::upstream_resource() Function



The C++ memory_resource::upstream_resource() function is used to get the associated memory resource of a polymorphic allocator. It is used in some memory resource classes to get the associated memory resource of a polymorphic allocator.

A upstream resource acts like as fallback or we can say parent for the current resource. It is used when the current resource is unable to allocate memory.

Exception: If upstream resources are not available then upstream_resource() may throw std::runtime_error exception.

Syntax

Following is the syntax for std::memory_resource::upstream_resource() function.

upstream_resource() const noexcept;

Parameters

It does not accepts any parameter.

Return Value

This function returns a pointer to the upstream memory resource.

Example 1

Let's look at the following example, where we are going to use the upstream_resource() in a simple custom memory resource that overrides the do_allocate and do_deallocate functions.

#include <iostream>
#include <memory_resource>
class a : public std::pmr::memory_resource {
private:
    std::pmr::memory_resource* upstream_resource_;
public:
    a(std::pmr::memory_resource* x = std::pmr::get_default_resource())
        : upstream_resource_(x) {}
protected:
    void* do_allocate(std::size_t bytes, std::size_t alignment) override {
        std::cout << "Allocating " << bytes << " bytes." << std::endl;
        return ::operator new(bytes);
    }
    void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override {
        std::cout << "Deallocating " << bytes << " bytes." << std::endl;
        ::operator delete(p);
    }
    bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override {
        return this == &other;
    }
public:
    std::pmr::memory_resource* x() const {
        return upstream_resource_;
    }
};
int main() {
    a my_resource;
    std::pmr::memory_resource* x = my_resource.x();
    std::cout << "Upstream resource: " << x << std::endl;
    return 0;
}

Output

If we run the above code it will generate the following output −

Upstream resource: 0x7fc8677c2290
cpp_memory_resource.htm
Advertisements