What are the risks of dynamic memory allocation in embedded systems, and when would you use a custom allocator?