The if(tilesetpath) and if(npclist) are what are unnecessary, so I removed them from the code I posted. If VC++ causes you trouble with that, then you are doing something wrong. (BTW, VC++ 7.1 is one of the most standards-conformant compilers available.) Of course, I was assuming that tilesetpath and npclist were not arrays but regular pointers. If they are arrays you should put the  in front of them instead of behind.
To delete an array, you put the  between the delete and the array name. Since you have a two-dimensional array, each value in the outer array is another array to be deleted. That is why I used delete  grid[i];. The name of the array is grid[i] and you put delete  in front of it. The outer array must also be deleted, and the outer array is just grid, so that is why I used delete  grid;.
The only other change I made was to loop from 0 to x, which as I said is because you have x rows (i.e. x inner arrays).
While vectors have their own learning curve, you don't have to do anything with them in the destructor, their data will be cleaned up automatically.