I'm no expert in C++, but I know a bit... I know you can use pointer syntax to instantiate arrays, but you're newing up an instance of Ball and treating it as an array of Ball.
It could be true that there is some sorcery that allows it to work as you've written it and that there's a bug somewhere else, but that's the issue that jumps out at me.
It's legal. Array indexing just adds to the base address, so if you index a pointer with zero you're referring to the base address. C/C++ doesn't do any kind of checking to see whether a pointer refers to one piece of data, many pieces of data or even undefined data (a pointer to God-knows-what). This is why STL features are preferred, since they do the legwork to make sure that access and allocation are a little more sane.
I'm wondering about what's going on with your depth sorting here, since sprite batching in DX can change the render order. Are you running DirectX in debug mode? You may want to see if there's actually a problem with the rendering or if you're somehow just rendering the ball underneath something else.