I understood that watchpoint watches for access, like read/write, not for deallocation.
Right, but when you use -gh (heaptrc) the memory is filled with trash on dealloc. So it will trigger.
Of course it will trigger many many more times before. That is why you do not stop (break) each time. You only take a snapshot. That gets you a stack (with 5 frames, or if the stack window is open, with 10 frames). The snapshot is stored, and the app continues to run.
When you hit the error, you can go through the snapshots (from the bottom upwards).