your (i) is incorrect (arena allocators can allocate objects of different types, and indeed one of their strong points is that they don't suffer from fragmentation) and your (ii) doesn't make sense because
not freeing an object is
always okay, according to conventional programming language semantics anyway
this particular arena allocator does allocate objects of different types, almost arbitrary types in fact:
fn alloc_uninitialized<T>(&self) -> NonNull<T> { ... }
the safety concern is that nothing
outside the arena survive the arena if it contains a pointer into the arena. as the linked micro-book puts it, 'it shouldn't be possible for any arena-allocated [variable] to outlive the memory that it[s data]'s located on.'