Can I drop the [] while deleteing array of some built-in type (char, int, etc)?
A: No. you can't
Sometimes programmers think that the [] in the delete[] p only present so the compiler will call the suitable destructors for all elements in the array. Due to this reasoning, they suppose that an array of some built-in type such as char or int can be deleted without the []. For example they suppose the following is valid code:
void userCode(int n)
{
char* p = new char[n];
...
delete p; // ERROR! Should be delete[] p !
}
However the above code is wrong and it can cause a blow at runtime. Particularly, the code that's called for delete p is operator delete (void*), however the code that's called for delete[] p is operator delete[](void*). For the latter the default behavior is to call the former, however users are allowed to replace the latter along with a different behavior (in which case normally they would also replace the corresponding new code in operator new[](size_t)). If they replaced the delete[] code thus it wasn't compatible along with the delete code, and you called the wrong one (that means if you said delete p instead of delete[] p), you could end up with a disaster at runtime.