1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
// Copyright (C) 2015-2025 Jonathan Müller and foonathan/memory contributors
// SPDX-License-Identifier: Zlib
#ifndef FOONATHAN_MEMORY_MALLOC_ALLOCATOR_HPP_INCLUDED
#define FOONATHAN_MEMORY_MALLOC_ALLOCATOR_HPP_INCLUDED
/// \file
/// Class \ref foonathan::memory::malloc_allocator.
/// \note Only available on a hosted implementation.
#include "config.hpp"
#if !FOONATHAN_HOSTED_IMPLEMENTATION
#error "This header is only available for a hosted implementation."
#endif
#include <cstdlib>
#include <memory>
#include "detail/lowlevel_allocator.hpp"
#if FOONATHAN_MEMORY_EXTERN_TEMPLATE
#include "allocator_traits.hpp"
#endif
namespace foonathan
{
namespace memory
{
struct allocator_info;
namespace detail
{
struct malloc_allocator_impl
{
static allocator_info info() noexcept;
static void* allocate(std::size_t size, std::size_t) noexcept
{
return std::malloc(size);
}
static void deallocate(void* ptr, std::size_t, std::size_t) noexcept
{
std::free(ptr);
}
static std::size_t max_node_size() noexcept
{
return std::allocator_traits<std::allocator<char>>::max_size({});
}
};
FOONATHAN_MEMORY_LL_ALLOCATOR_LEAK_CHECKER(malloc_allocator_impl,
malloc_alloator_leak_checker)
} // namespace detail
/// A stateless \concept{concept_rawallocator,RawAllocator} that allocates memory using <tt>std::malloc()</tt>.
/// It throws \ref out_of_memory when the allocation fails.
/// \ingroup allocator
using malloc_allocator =
FOONATHAN_IMPL_DEFINED(detail::lowlevel_allocator<detail::malloc_allocator_impl>);
#if FOONATHAN_MEMORY_EXTERN_TEMPLATE
extern template class detail::lowlevel_allocator<detail::malloc_allocator_impl>;
extern template class allocator_traits<malloc_allocator>;
#endif
} // namespace memory
} // namespace foonathan
#endif //FOONATHAN_MEMORY_MALLOC_ALLOCATOR_HPP_INCLUDED
|