g_engine->AddSprite(sprite);
Is your g_engine created correctly? It is a pointer so you might receive the EXC_BAD_ACCESS if you also forgot "= new Engine()" here.
I see no reason why g_engine should be a pointer, use pointers as few as possible.
Don't keep g_engine as a pointer, maybe this solves your problem. If not then I don't think I can help you because I don't see anything wrong.
Anyway, I thought that if you have to pass objects between classes, especially into a data structure, that you have to use pointers since references are not assignable.
Unless you want to be able to change the pointer or have a NULL pointer you should always try to use references in functions.
You can always use references, the list will make a copy of it.
I have also been told by a lot of resources online and in a few books that a list of pointers to sprites on the heap is good way of making a sprite handler
I don't know about a std::list, but for e.g. std::vector this would be correct. It has to allocate enough space for every object. A pointer is only 4 bytes while the sprite itself is a lot bigger. So when using a pointer reallocation will be faster.
Basically my advice would be to use pointers as less as possible.
I don't even think you can get a segfault or EXC_BAD_ACCESS when not using pointers.