How I do it in DarkBasic, which will probably be alot easier in C++, is have a big UDT array of bullets like you say, say the array is big enough to handle 300 bullets, and one of the fields in my UDT is Status, and when I make a bullet, I set the status of it to 1.
When creating the bullet, I loop though the array to find a slot where Status = 0, and stick my bullet there. I then loop through my array when I'm drawing everything and if Bullets(i).Status = 1 then I update/draw the bullet. If it collides I kill the bullet and set Status to 0 so that the slot can be used for another bullet later