Как SetLength() выделяет память в Delphi

Когда массив объявлен в этой форме, память распределяется статически:

var
 Data: array[0..5] of integer;

Мой вопрос в том, когда массив объявляется следующим образом:

var
 Data: array of integer;
....
SetLength( Data, Length( Data ) + 1 );

Является ли память распределенной статически или динамически?

Я думаю, что память распределена статически, и массив копируется в память, но я не уверен.

2 ответа

Это динамическое распределение по трем причинам:

  • Статическое распределение может выполняться только во время компиляции. Как правило, если вы используете для этого процедуру или функцию, динамическая память выделяется из диспетчера памяти.
  • Поскольку значение Length( Data ) + 1 зависит от информации, которая известна только во время выполнения, ее нельзя назначить статически.
  • Статический буквально означает "неизменный", а динамический означает "изменение". Ваш вызов SetLength меняет размер массива, увеличивая его на 1. Следовательно, здесь может быть только динамическое распределение.


Тип, который вы объявили, array of Integer, называется динамическим массивом . Динамический массив выделяется вызовом SetLength, а память динамическая.

licensed under cc by-sa 3.0 with attribution.