1. Which design pattern is used in the following code?

#include <cassert>
#include <cstddef>
#include <map>
#include <new>
#include <utility>

class BufferProvider
{
public:
    BufferProvider() { }
    BufferProvider(const BufferProvider&) = delete;
    BufferProvider& operator=(const BufferProvider&) = delete;

public:
    char* acquire_buffer(size_t n)
    {
        assert(n > 0);

        char *b = nullptr;
        Size2Buffer::iterator i = m_available_buffers.lower_bound(n);
        if (m_available_buffers.end() == i) {
            b = new (std::nothrow) char[n];
            if (b != nullptr) {
                m_acquired_bufers.insert(std::make_pair(b, n));
            }
        }
        else {
            b = i->second;
            assert(b != nullptr);
            m_acquired_bufers.insert(std::make_pair(b, i->first));
            m_available_buffers.erase(i);
        }

        return b;
    }

    void release_buffer(char *b)
    {
        assert(b != nullptr);

        Buffer2Size::iterator i = m_acquired_bufers.find(b);
        assert(i != m_acquired_bufers.end());
        m_available_buffers.insert(std::make_pair(i->second, b));
        m_acquired_bufers.erase(i);
    }

private:
    typedef std::multimap<size_t, char*> Size2Buffer;
    Size2Buffer m_available_buffers;

    typedef std::map<char*, size_t> Buffer2Size;
    Buffer2Size m_acquired_bufers;

public:
    ~BufferProvider()
    {
        assert(m_acquired_bufers.empty());

        Size2Buffer::iterator i = m_available_buffers.begin();
        for (; i != m_available_buffers.end(); ++i) {
            delete [] i->second;
        }
    }
};