Получить количество байтов, хранящихся в блоке памяти? - PullRequest
0 голосов
/ 13 марта 2009

Я выделяю блок памяти в C # для извлечения информации из неуправляемого буфера данных:

handle = Marshal.AllocHGlobal(33455);

Максимальный размер извлекаемой информации составляет 33 455 байт, но размер информации может быть меньше, чем в некоторых случаях.

Как определить, сколько байтов фактически используется в выделенном блоке, а не сколько фактически выделено?

Ответы [ 2 ]

4 голосов
/ 13 марта 2009

Как система должна знать, какие данные используются в сравнении со случайными? Он ничего не знает о структуре ваших данных. Все, что он знает, это то, сколько ты выделил. Вы не храните байты в ручке. Дескриптор просто ссылается на кусок памяти, который был выделен для вас.

Вы можете инициализировать данные с помощью часового значения (например, 0xcdcdcdcd, которое Windows будет делать в режиме отладки), а затем вычислить его. Или, если данные являются строкой, вы можете вызвать strlen () (или одну из безопасных строковых функций). Или вы можете написать некоторые функции-оболочки, которые обертывают API-интерфейсы, которые вы используете для записи в память и отслеживания объема используемых вами данных.

1 голос
/ 13 марта 2009

Согласно документации на MSDN на

http://msdn.microsoft.com/en-us/library/s69bkh17.aspx

Вы либо выделите эту память, либо получите исключение нехватки памяти, если запрос не может быть выполнен.

Таким образом, ответ на ваш вопрос таков: 1) иметь 33455 байт памяти, выделенных и на которые ссылается «handle», или ... 2) Будет сгенерировано исключение «Недостаточно памяти», и у вас будет ноль байтов памяти, выделенных и на которые будет ссылаться «дескриптор».

На этом очень низком уровне, это все, что вы знаете.

Вы можете либо сохранить счет в начале блока, чтобы указать, сколько вы использовали, либо использовать значения часового, как было предложено.

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