No, the two features are not comparable.
Address sanitization is not a security feature, nor does it provide memory-safety: it's a debugging tool. Programmers already have tools to detect that the code they've written has memory problems, such as use-after-free or memory leaks. Valgrind is probably the best-known example. This gcc feature provides (some of) the same functionality: the only new thing is that it's integrated with the compiler, so it's easier to use.
You wouldn't have this feature turned on in production: it's for debugging only. You compile your tests with this flag, and automatically they detect memory errors that are triggered by the test. If your tests aren't sufficient to trigger the problem, then you still have the problem, and it'll still cause the same security flaws in production.
Rust's ownership model prevents these defects by making programs that contain such defects invalid: the compiler will not compile them. You don't have to worry about your tests not triggering the problem, because if the code compiles, there cannot be a problem.
The two features are for different sets of problems. One feature of address sanitization is to detect memory leaks (allocating memory and neglecting to free it later). Rust makes it harder to write memory leaks than in C or C++, but it's still possible (if you have circular references). Rust's ownership model prevents data races in sequential and multi-threaded situations (see below). Address sanitization doesn't aim to detect either of those cases.
An example of a data race in sequential code is if you're iterating over a collection of objects, while also adding or removing elements. In C++, changing most collections will invalidate any iterators, but it's up to the programmer to realise this has happened: it's not detected (though some collections have extra checks in debug builds). In Rust, it's not possible to mutate the collection while an iterator on it exists, because the ownership model prevents this.
An example of a data race in multithreaded code is having two threads that share an object, with access protected by a mutex. In C++, it's possible for the programmer to forget to lock the mutex while changing the object. In Rust, the mutex itself owns the object it protects, so it's not possible to access it unsafely. (There are many other kinds of concurrency bugs, though, so don't get carried away!)