Ok, if your code works then I'd say don't touch it. But in case you want to optimize it or make it less error-prone anyway, here are two strategies that you could follow:
1. Since sounds cannot be copied nor moved around, storing (smart) pointers to dynamically allocated instances would solve all the issues that you have with the way you store them; this would relax constraints on what type of container you use, and what operations you can do on it.
2. Instead of constantly creating and deleting sounds, you could just reuse those that are stopped.