Как прочитать размер массива из перераспределенного блока памяти?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как прочитать размер массива из перераспределенного блока памяти?

Сообщение Anonymous »

Я пытаюсь понять, как delete[] arr узнает размер arr. И читайте здесь о чрезмерном распределении. При тестировании

Код: Выделить всё

char* a = new char[24];
char* b = new char;

printf("a = %p\n", a);
printf("b = %p\n", b);

size_t n = *(size_t*)(a-8);
printf("%zu\n", n);  // also tried different format specifier, output is always 33
он ​​показывает, что были выделены дополнительные 8 байт, но значение, прочитанное из (a-WORDSIZE), для меня не имеет никакого смысла.

Код: Выделить всё

a = 0x7d7c2c0
b = 0x7d7c2e0
33
Итак, мой вопрос заключается в том, как я могу прочитать количество элементов в блоке массива/памяти из указателя (если используется избыточное выделение)?
Изменить:
Как указывали другие, не гарантируется, что последовательное выделение памяти размещается в последовательных блоках памяти (и все блоки памяти имеют минимальный размер), но я заметил, что при увеличении до размера 25 количество байт между обоими указателями char становится 48, а с размером 41 разница становится 64 и так далее... .
Также я заметил, что n постоянно соответствует разнице адресов +1. Вроде бы он соответствует размеру блока памяти, но я все еще спрашиваю себя, почему размер блока + 1, а не количество элементов?
А также при использовании нетривиального деконструируемого типа (структура с указателем) разница a и b всегда имеет 8 дополнительных байтов (или 4 на 32-битной архитектуре).

Подробнее здесь: https://stackoverflow.com/questions/798 ... mory-block
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»