bin.image is a pointer. During initialization, it's made to point to a 4-long array of unsigned char*. I will use # to indicate uninitialized values. Pictorially, it looks like this:
bin.image --> # # # #
Then, you allocated four new arrays (the pointers to which I will call r0, r1, r2, and r3), and assigned them to the four entires of bin.image, so memory looks like this
bin.image --> r0 r1 r2 r3
r0 --> # # #
r1 --> # # #
r2 --> # # #
r3 --> # # #
Of course, you initialized all of those to zeroes:
bin.image --> r0 r1 r2 r3
r0 --> 0 0 0
r1 --> 0 0 0
r2 --> 0 0 0
r3 --> 0 0 0
Then, back in test1, you repeated the process with a variable image. So now, we have 10 dynamically allocated arrays lying about:
bin.image --> r0 r1 r2 r3
image --> r4 r5 r6 r7
r0 --> 0 0 0
r1 --> 0 0 0
r2 --> 0 0 0
r3 --> 0 0 0
r4 --> # # #
r5 --> # # #
r6 --> # # #
r7 --> # # #
After invoking your original getImage, everything looks like this
bin.image --> r0 r1 r2 r3
image --> r0 r1 r2 r3
r0 --> 0 0 0
r1 --> 0 0 0
r2 --> 0 0 0
r3 --> 0 0 0
r4 --> # # #
r5 --> # # #
r6 --> # # #
r7 --> # # #
(as well as corrupting memory in the 8 memory locations past the end of the image array)
Note that you've lost the values r4, r5, r6, and r7, and have no way of recreating them. So, the memory they pointed to has been forever lost.
Then, test1 deallocates the entries of image, and so memory looks like this:
bin.image --> r0 r1 r2 r3
image --> r0 r1 r2 r3
r4 --> # # #
r5 --> # # #
r6 --> # # #
r7 --> # # #
And then deallocates image.
bin.image --> r0 r1 r2 r3
r4 --> # # #
r5 --> # # #
r6 --> # # #
r7 --> # # #
When you exit test1, bin.~CBin gets called. ~CBin loops through the elements of bin.image and tries to deallocate them. However, r0, r1, r2, and r3 are all nonexistent at this point: bin.image[0] does not point to a valid memory location. So, invoking delete[] bin.image[0] does bad things.