Ответ 1
Это должна быть ошибка gcc. Что полное выражение new[]
игнорируется, а p
становится неинициализированным, а затем мы delete[]
неинициализированный указатель, который сбой. Если мы скомпилируем программу с помощью -Wall
, она предупредит вас, что
warning: 'p используется неинициализированным в этой функции
что явно неверно. Выражение new X[0]
хорошо определено как в С++ 03, так и в С++ 11 (§5.3.4/7), и это корректно работает в clang, поэтому единственный логический вывод состоит в том, что это ошибка gcc.
Исключительная ошибка new[]
существует только тогда, когда тип, который должен быть сконструирован, имеет какой-либо нетривиальный конструктор. И segfault бывает, что у типа есть деструктор, потому что delete[]
тогда потребуется разыменовать неинициализированный указатель. Поэтому он падает на std::string
, но не int
, потому что int
тривиален и std::string
не является.
Это можно обойти с помощью промежуточной переменной, так что выражение не может быть напрямую оценено на 0:
size_t length = 0;
std::string* p = new std::string[length];
// ...
delete[] p;