malloc(), realloc().. the dark side powerful it is

If you can allocate more memory while running, you need that space available. So rather than fragmenting your ram, just create a buffer as big as you need to begin with. then create/move/modify/destroy objects in that space.

  #define MAX_ITEMS 10

  //Raw memory allocation / deallocation.
  void *operator new( size_t size ){ return malloc( size ); }
  void operator delete( void * ptr ){ free( ptr ); return; }
  
  //Placement new/delete
  void *operator new( size_t size, void * ptr ){ return ptr; }
  void operator delete( void * ptr, void *ptr2 ){ return; }
  
  struct Obj{
    int i_Something;
    bool b_SomethingElse;
  }; 

void setup( void ){
  
  //Allocate data
  void *v_Data = operator new( ( size_t ) ( sizeof( Obj ) * MAX_ITEMS ) );

  //Represent allocation as an arraoy of Obj
  Obj *o_Array = ( Obj* ) v_Data;

  //Construct some objects in the allocation.
  new( o_Array++ ) Obj;
  new( o_Array++ ) Obj;
  new( o_Array ) Obj;
  
  //Reset array.
  o_Array = ( Obj* ) v_Data;

  //Do something with objects.
  if( o_Array[ 1 ].b_SomethingElse ) 
    ++o_Array[ 1 ].i_Something;
    
  //When done with objects
  ( o_Array++ )->~Obj();
  ( o_Array++ )->~Obj();
  ( o_Array )->~Obj();  

  //When done with allocation.
  operator delete( v_Data  );
  return;
}

void loop( void ){ return; }