same as Yuri, "I have never had any such error on x64 with GlobalAlloc/Free" but since the error specifically refers to Heap Overrun seems it must be related. I do, however get c0000005 a lot when converting 32 to 64; usually my memory pointer (rdi, say) is 0. It happens because I had to change the pointers quite a lot going 32-64 and made a mistake doing so.
I also got c0000005 in relation to GlobalAlloc; not because there's anything wrong with it, but again, I made errors converting, and was trying to access outside the allocated block. Thinking (as u suspect) there was something wrong with alloc'ed mem, in desperation I converted all my alloc'ed blocks to uninitialized memory (data?) and cured the problem! So if it's convenient u might try that; can be easier to keep track of things that way. Later I went back to alloc'ed mem; was easy enough now, because I was starting with a stable program.
BTW I was converting many thousands of lines, so pointer mistakes were more or less inevitable; if you're dealing with much smaller progs u can probably see at a glance that your pointers are all right, so my experiences might not be applicable.