Some confusion of UObject*, UPROPERTY decorator, and UWeakObjectPtr

TWeakObjectPtr has no pin functionality, AFAIK. That is it acts such that…
a UObject’s lifetime (regardless it being in a weak ptr) is guaranteed throughout the life of a function. So as long as it is valid at the start of the function, it should be valid the rest of the function - I am assuming because the game doesn’t tick during the function (so it doesn’t hit GC).

Once a UObject* is GC’d, it is automatically set to null; this is basically what a weak ptr does, right? So it just seems like a UObject* is either a shared_ptr (UPROPERTY, etc.), or a weak ptr (just UObject*)

This is the crux of the question, what is the difference between a non-UPROPERTY UObject* and a WeakObjectPtr.

I could be wrong about all of this.