This (and the one for TagCompound) shouldn't be necessary.  A std::list will deallocate its own memory on destruction.  On the other hand, if you actually want to delete the Tag instances that the _data pointers reference (assuming they're heap-allocated), you will need to iterate through the list and delete each one.  In that case, they'll probably need virtual destructors.