when you write int**ppint; you are creating a pointer which should point to an integer pointer. In line
ppint = new int*[row];
you are doing this correctly by setting ppint to point to the first element of an integer pointer array of size row. However when you say
for (int i=0; i<row; i++)
ppint[i]=new int(col);

you are getting only one new integer value of col to the address location which ppint[i] point to. But what you intent to do, is to create a 4*4 array so you should get an integer array of size col to each of
ppint[i] pointers. It should be like this:
for (int i=0; i<row; i++)
ppint[i]=new int[col];

Now you have a 4*4 array.

The rest of the code is now Ok. You are creating a unit matrix and print it. For the lines
for (int a=0; a<row; a++)
delete [] ppint[a];
what you do before the mistake is try to free memory consisting of arrays of size col each. However instead of an array, you have
only one integer.

What you do now is to free the memory locations to which ppint[i] pointers point, for the system. (these spaces are reclaimed by the system). Now you have got ridden each of the arrays of size 4, so it is the time to get rid of that pointers in the array. So in the line
delete [] ppint;
you are freeing the locations where ppint points (the ppint pointer array).

If it is difficult to understand, reply again. I will draw a figure and it will be easier to understand.

for pp[2] and pp[3] it is like pp[0] and pp[1]
note pp[i][j] are integers.
------------------------------------------------------------------------------
after first delete in for loop:
ppint------> [ppint[0]]
[ppint[1]]
[ppint[2]]
[ppint[3]]
-------------------------------------------------------------------------
after second delete:
ppint
-------------------------------------------------------------------------
Well, after ppint = new int*[row];
you are creating pointers to point to the beginning of row 0, 1, 2, 3. When you write the first loop, that pointers are set
to the beginning of the rows.
--------------------------------------------------------------------------
as you can see this differs from
int ppint[4][4] because the memory locations of different rows do not follow each other.
However in int ppint[4][4] all the memory locations of the array is contiguous.
--------------------------------------------------------------------------
Hope this helps.