byte配列を構造体にコピーしようとしているのですが、
Marshal.PtrToStructureはポインタのアドレスをマネージドの構造体に
関連付けさせるだけなのでしょうか?

たとえば
UData = (UserData)Marshal.PtrToStructure(ptr, typeof(UserData));

このようにした際に ptrをMarshal.FreeHGlobalした場合UDataの内容は保証されない状態になってしまうのでしょうか?