Вы никогда не должны использовать функцию unsafe
без понимания ее документации, 100%.
Итак, что означает String::from_raw_parts
:
Безопасность
Это крайне небезопасно из-за количества не проверенных инвариантов:
- Память на
ptr
должна быть предварительно выделена тем же распределителем стандартная библиотека использует с необходимым выравниванием ровно 1. length
должно быть меньше или равно емкости. capacity
должно быть правильное значение.
Нарушение этих правил может вызвать проблемы, такие как повреждение внутренних структур данных распределителя.
Владение ptr эффективно передается в строку, которая затем может освобождать, перераспределять или изменять содержимое памяти, на которое указывает указатель по желанию. Убедитесь, что больше ничего не использует указатель после вызова этой функции.
Здесь выделяются две вещи:
- Память в
ptr
должна быть предварительно selected. capacity
должно быть правильным значением.
И это связано с тем, как в Rust работает распределение. По сути, для освобождения требуется только то самое значение (и тип) указателя, которое вернуло выделение.
Шенаниганы, такие как попытка освободить указатель, указывающий на середину выделения, с другим выравниванием или с другим размером, Не допускаются.
Кроме того, вы также пропустили:
- Убедитесь, что ничто другое не использует указатель после вызова этой функции.
Здесь, оригинал экземпляр String
все еще владеет выделением, и вы пытаетесь освободить один байт из него. Это никогда не может go хорошо.