you have a few options.
1) you can create a new ** and allocate to the new size, copy the data over to it, and then destroy the old one.
2) you can use malloc, and realloc, to resize. This is ugly, and makes use of old C functions that cause issues on classes.
3) you can use a vector, which can grow on the fly.
4) you can use a 1d array, possibly with #2 or #3 ideas, and treat it like 2d. This saves a lot of trouble, you can for example transpose (flip the rows and cols) without resizing at all, and new/delete are cheaper, you can memcpy, and more.
if you don't need the current data, you can skip the copy steps.
forget old width. just delete the original, and allocate it again with the new values, if you don't want to keep the data. You are pretty close.
for( x = ... oldwidth ...)
delete[] cp[x];
delete[] cp;
then allocate it again like you did the first time around.