Prove every allocation has an owning release path
Match each dynamic allocation with a release before the lifetime of its final owning pointer ends, except for deliberately documented program-lifetime objects. Review early returns, error handling, ownership transfers, and reallocation paths for lost pointers. Use leak detection or static analysis and long-running tests to find memory growth that short functional tests may miss.
MEM31-C: Free dynamically allocated memory when no longer needed — Carnegie Mellon SEI