There's certain classes of C's UB that can be addressed, but most of it can never be without neutering C to the point of uselessness.
Then you come up with the "solution" that everybody must always check for NULL pointers before dereferencing them. If everybody always did that we might as well just define the behavior of reference-after-free, because what you said either a) requires you to keep a reference count (or null-check before every deref which may be even more expensive) at runtime(!), or b) requires a program-level proof.
So... no. What you suggested is not a solution in any meaningful sense.
If you never reuse addresses, long running programs will have some trouble ahead.
Oh, it's not even that simple because you'd have to make access to the region atomic.