As others have commented, you probably are corrupting the heap somewhere. (Someone who commented this should make it an answer so they can take the credit.)
About your bonus questions: When you write to an element of an array (for speed) there is no checking whether the index in within bounds in C and C++. (Of course, you will get a segmentation error is you try to write to memory that doesn't belong to you.)
Before and after the memory you get from new[], several specially formatted bytes are allocated for bookkeeping. When you use delete[], the validity of those bytes will be checked to detect a corrupt heap. If I'm not mistaken, if and how this works depends on your platform and compiler.