Use a managed block.
Allocate a chunk of memory as big as the max number of objects. ( no point making it smaller as you said a user has the ability to create max objects. )
If you haven't run out of memory yet, you can now create your objects in that block.
void *v_Data = malloc( sizeof( MYSTRUCT ) * MAX_OBJECTS );
MYSTRUCT *m_Data = ( MYSTRUCT* ) v_Data;
m_Data->MYSTRUCT(); //Construct object.
m_Data++; //Move to next memory block.
m_Data->MYSTRUCT(); //Construct second object
//Do stuff with objects
//When done
m_Data = ( MYSTRUCT* ) v_Data; //Ptr back to start
m_Data->~MYSTRUCT(); //Destruct objects.
m_Data++;
m_Data->~MYSTRUCT(); //Destruct objects.
//When done
free( v_Data );
This way, only the block can become fragmented, not the whole SRAM ( only 1 allocation )
You can use the block of data like an array too.