Что находится в памяти динамического массива при использовании с SetLength в Delphi? - PullRequest
8 голосов
/ 21 октября 2010

У меня есть динамический массив myArr.Что хранится в памяти в myArr, когда мы используем SetLength на нем?Это 00?Или не определено?

SetLength выделяет 16 байтов памяти для myArr в этом случае.

myArr : array of byte;

SetLength(myArr, 16);

Ответы [ 2 ]

13 голосов
/ 21 октября 2010

Цитируется из справки Delphi 7: «Для переменной длинной строки или динамического массива SetLength перераспределяет строку или массив, на которые ссылается S , на заданную длину. Существующие символы в строке илиэлементы в массиве сохраняются, но содержимое вновь выделенного пространства не определено . Единственное исключение - увеличение длины динамического массива, в котором элементы являются типами, которые должны быть инициализированы (строки, варианты,Вариантные массивы или записи, содержащие такие типы.) Когда S является динамическим массивом типов, которые должны быть инициализированы, вновь выделенное пространство устанавливается на 0 или nil. "

По моим наблюдениям, для статического массива неинициализированные элементы содержат случайные данные.Для динамического массива, AFAIK начиная с Delphi 7, неинициализированные элементы содержат свое значение по умолчанию ничто .Однако вы не должны полагаться на этот факт, потому что это была деталь реализации SetLength.Вместо этого вы должны следовать официальной документации.

7 голосов
/ 21 октября 2010

На практике он инициализируется нулями.

Метод SetLength внутренне вызывает System.DynArraySetLength.
При использовании Delphi 5 память заполняется #0.

// Set the new memory to all zero bits
FillChar((PChar(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0);

Я предполагаю, что это поведение не изменилось в более поздних версиях Delphi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...