If an object has been deleted, and you follow a pointer to it, it's not a problem -- unless the object has also been deallocated. If an object has been deleted, you discover the fact by reading the "deleted" flag in the object. If it's been deallocated, then you cannot discover the fact; your program will segfault the minute you follow the dangling pointer. This is why you need a reclamation queue and a cooldown period before the record is reused; If you're keeping pointers to records, then unless you can prove that every pointer to a record has been NULL'ed, you don't ever deallocate that record.
I handle it with a hash table, so a reference from one item or creature to another item or creature is always an ID, never a pointer. So I can check for ID mapped to NULL before I follow a pointer and segfault. I think this is actually pretty important considering all the places where I can want to have references to items. It's far easier than keeping track of all the different pointers that might need to be NULL'ed when something is deallocated.
Basically, I guess there's three choices;
1) one "owning" pointer to an item or creature, probably from the map, and all other places where you need it you have to iterate to find it;
2) one "owning" pointer to an item or creature, from a hash table, and all places where you need it you consult the hash table; or
3) multiple pointers to items and creatures, and you can't deallocate ever unless you can prove that every pointer in every possible place is NULL. Instead you have to keep the record around in a deleted state and may eventually reuse it subject to the risk of more minor bugs.