You would basically have to issue a check for every memory read through a pointer. Some moving GCs are based on this design, so it's feasable and can be made efficient enough. You can also argue that you've effectively described Valgrind, so yes, "simply always run C/C++ via Valgrind" (or a comparable sanitizer) would work.
However, it's much more convenient to use a language where safety wasn't an afterthought (such as Nim, Rust, Swift, ...) and the performance of these is better than "C plus a sanitizer" too...
and in this case its not.
That means I haven't understood your idea. But the chances that you came up with a truly unique novel idea of how to "solve" the memory safety problems for C/C++ are close to zero at this point, sorry. The solutions have pretty much been enumerated completely at this point -- but they are not applied for one reason or another. Both for good and for bad reasons.