All ideas are crap..
You´re loosing the OO thinking here.. Why should the end user have to struggle with smart pointers and surface memory allocations just to draw a sprite?
I believe a referencing / subclassing system like the one used in 3dsmax would be most efficient, and I will be implementing a similar one in gapidraw (sprites are so easy to do, but still everyone feels that sprite support is important for a library).
(1) Let each sprite be a surface. Draw to the sprite and you draw the surface. Delete the sprite and you delete the surface. Use subclassing to inherit from a surface to the sprite.
(2) 15 similar bullets? Create a new sprite and pass an option to let it reference to the first one. The referencing could be done using simple multiple-to-multiple references (change base -> all references change, change reference->all other changes). Draw a change to one of the bullets and all other bullets will change instantly. Going the 3dsmax way, one could also add an option that it you can override some properties of the base object, and the ones not overridden will still be used as they are in the base (change base -> all references change, change reference->no other change).
(3) What happens if I delete the "base sprite".. Won't that crash the application? Not if you use an internal referencing system (delete base -> notifies all childs, delete child -> notifies base).
[Edited - changed some errors in (2)]
/Johan