Операция, которая возвращает адрес байтовектора в виде целого числа, опасно опасна, поскольку сборщик мусора может впоследствии переместить байтовый вектор и поместить туда другие объекты. Передача устаревшего адреса в код C может привести к повреждению памяти.
Документы для foreign-procedure
схемы Chez говорят, что аргумент, объявленный как u8*
, принимает байтовый вектор и передает адрес его содержания для внешней функции. Это безопасно, потому что FFI и G C взаимодействуют, чтобы гарантировать, что объект не перемещается между взятием адреса и вызовом сторонней функции --- но смотрите предупреждение о сохранении указателя во внешних структурах данных. См. Также lock-object
, который временно препятствует перемещению или возвращению объекта G C.
В Racket иностранные типы _bytes
и _pointer
работают аналогично. Также есть операция ptr-add
, которая комбинирует объект, подобный указателю, со смещением. Например, если bs
является строкой байтов, то (ptr-add bs 1 _byte)
надежно преобразуется в адрес второго байта bs
, даже если G C перемещается bs
. Я не знаю, есть ли у Chez похожая функция.