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.