Firstly, there are no "designated initializers" in any of your examples. Your second example uses aggregate initializer syntax without any actual initializers in it being "designated".
Secondly, none of this has anything to do much with aggregate initializers. The primary difference resides on the left-hand side: float* rgba in the first case and float rgba[] in the second case.
In the second case you are actually declaring an array, and it is either a local or static array (depending on where that declaration resides). Local and static memory shall not be deallocated with free. It cannot be deallocated by you at all. You don't own local or static memory, which means that it is not your business to worry about its deallocation. Local and static objects have pre-determined lifetimes that follow pre-determined rules. They are created and destroyed automatically in full accordance with those rules.
In the first case you are not really declaring an array at all. You are declaring a pointer that points to a dynamically allocated memory block. You own all memory blocks you dynamically allocate, which means it is your responsibility to properly deallocate them.