void TrackFree(void *p) { // It's perfectly valid for "p" to be null; return if it is. if (p == NULL) return; // Get the prolog address for this memory block. UserChunk *pUser = reinterpret_cast<UserChunk *>(p); PrologChunk *pProlog = GetPrologAddress(pUser); // Check the signature, and if it's invalid, return immediately. Signature *pSignature = GetSignatureAddress(pProlog); if (!Signature::IsValidSignature(pSignature)) return; // Destroy the signature. pSignature->~Signature(); pSignature = NULL; // Unlink the block header from the list and destroy it. BlockHeader *pBlockHeader = GetHeaderAddress(pProlog); BlockHeader::RemoveNode(pBlockHeader); pBlockHeader->~BlockHeader(); pBlockHeader = NULL; // Free the memory block. free(pProlog); }
void TrackStamp(void *p, const MemStamp &stamp, char const *typeName) { // Get the header and signature address for this pointer. UserChunk *pUser = reinterpret_cast<UserChunk *>(p); PrologChunk *pProlog = GetPrologAddress(pUser); BlockHeader *pHeader = GetHeaderAddress(pProlog); Signature *pSignature = GetSignatureAddress(pProlog); // If the signature is not valid, then return immediately. if (!Signature::IsValidSignature(pSignature)) return; // "Stamp" the information onto the header. pHeader->Stamp(stamp.filename, stamp.lineNum, typeName); }