* «Тот факт, что я могу подписать указатель, говорит мне о том, что я pointer = new int
неявно создает массив. Но если так, то какой это размер?» *
Это была часть вопроса, которая мне больше всего понравилась и на которую вы обращаете особое внимание.
Как мы все знаем, динамическое распределение памяти использует пространство в стеке, которое является специфическим для данной программы .Когда мы более внимательно посмотрим на определение нового оператора: -
void* operator new[] (std::size_t size) throw (std::bad_alloc);
Это фактически представляет массив объектов этого определенного размера, и если это успешно, то он автоматически Создает каждый из объектов в массиве.Таким образом, мы можем свободно использовать объекты в пределах размера, потому что он уже был инициализирован / сконструирован.
int * pointer = new int;
С другой стороны, для приведенного выше примера есть все возможности неопределенного поведения, когда любой из
*(pointer + k) or *(k + pointer)
.Хотя к определенной ячейке памяти можно получить доступ с помощью указателей, нет никакой гарантии, потому что конкретный объект для нее не был создан или создан. Это можно рассматривать как пространство, которое не было выделено в стеке для конкретной программы.
Надеюсь, это поможет.