Program Listing for File heaphook.hpp
↰ Return to documentation for file (include/heaphook/heaphook.hpp
)
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <cstdio>
#include <unistd.h>
#include <cstring>
#include <chrono>
#ifdef TRACE
static constexpr bool HeapTraceEnabled = true;
#else
static constexpr bool HeapTraceEnabled = false;
#endif
namespace heaphook
{
// this class designed with singlton design pattern.
class GlobalAllocator
{
protected:
// users cannot use default constructor
GlobalAllocator();
public:
// uncopyable and unmovable
GlobalAllocator(const GlobalAllocator &) = delete;
GlobalAllocator & operator=(const GlobalAllocator &) = delete;
GlobalAllocator(GlobalAllocator &&) = delete;
GlobalAllocator & operator=(GlobalAllocator &&) = delete;
// Users must implement this method as follows
//
// static GlobalAllocator &get_instance() {
// static DerivedAllocator allocator;
// return allocator;
// }
static GlobalAllocator & get_instance();
// alloc allocates size bytes and return base address.
// alloc is called from mallo, aligned_alloc, etc..
//
// size is a positive value.
//
// if no alignment is specified, it defaults to 1.
// if specified, it is a value satisfying the following conditions
//
// * align is a power of 2
// * align is a multiple of sizeof(void*)
//
// if allocation fails, returns nullptr.
[[nodiscard]]
void * alloc(size_t size, size_t align = 1);
// this member function releases memory areas allocated
// by alloc, alloc_zeroed, and realloc.
//
// ptr is not nullptr and must be the value returned by those functions.
void dealloc(void * ptr);
// this function returns the size of the memory area pointed to by ptr.
size_t get_block_size(void * ptr);
// this function similar to alloc,
// differing only in that it initializes the allocated area with 0.
//
// size > 0
//
// if allocation fails, returns nullptr.
[[nodiscard]]
void * alloc_zeroed(size_t size);
// this function resizes the allocated area
//
// new_size > 0
// ptr != nullptr
//
// if allocation fails, returns nullptr.
[[nodiscard]]
void * realloc(void * ptr, size_t new_size);
private:
virtual void * do_alloc(size_t, size_t) = 0;
virtual void do_dealloc(void *) = 0;
virtual size_t do_get_block_size(void *) = 0;
// this member function has default implementation
virtual void * do_alloc_zeroed(size_t size);
// this member function has default implementation
virtual void * do_realloc(void * ptr, size_t new_size);
};
} // namespace heaphook