Учтите:
delete new std :: string [2];
delete [] new std :: string;
Всем известно, что первое - это ошибка. Если бы второй не был ошибкой, нам не понадобились бы два разных оператора.
Теперь подумайте:
std :: unique_ptr <int> x (new int [2]);
std :: unique_ptr <int> y (new int);
Знает ли x
использовать delete []
вместо delete
?
Справочная информация: этот вопрос всплыл в моем head, когда я подумал, что определение типа массива указателей будет удобной функцией языка.
int *[] foo = new int [2]; // OK
int * bar = new int; // OK
delete [] foo; // OK
delete bar; // OK
foo = new int; // Compile error
bar = new int[2]; // Compile error
delete foo; // Compile error
delete [] bar; // Compile error