Код имеет определенное поведение и работает нормально. С этим нет никаких проблем, за исключением того, что вы пропускаете последнее выделение, что не совсем оптимально (но законно). Добавьте delete[] pointer;
в конце.
Версия массива new
не возвращает вновь созданный массив или указатель или ссылку на него. Вместо этого он возвращает указатель на первый элемент во вновь созданном массиве.
pointer = new std::string[size];
После этого pointer
будет указывать на первый std:.string
из вновь созданного массива std::string[size]
. Просто взглянув на pointer
, вы не узнаете, является ли std::string
, на который он указывает, частью массива или нет.
Именно поэтому вы можете ссылаться как на массивы, так и на отдельные объекты через один и тот же тип указателя. , То же самое работает с автоматическими c массивами, которые распадаются на указатели на их первый элемент при назначении указателю.
Вот почему вам, как программисту, нужно помнить, какой указатель указывает на один объект, выделенный с помощью new
и какой из них указывает на массив, выделенный с помощью new[]
, и длину этого массива (поскольку в первом случае вам нужно удалить его с помощью delete
, а во втором с delete[]
).
На практике вы не должны использовать raw new
как этот по этой причине (и другие). Вместо этого используйте контейнеры, такие как std::vector
, если вам нужны массивы с динамическим размером, и std::unique_ptr
, если вам нужны динамически размещаемые отдельные объекты (хотя существует также версия std::unique_ptr
для массивов).