Почему Rust считает безопасным утечку памяти? - PullRequest
4 голосов
/ 13 мая 2019

Согласно этой главе в Rust Book , утечка памяти возможна путем создания цикла указателей:

Гарантии безопасности памяти в Rust затрудняют, но не делают невозможным случайное создание памяти, которая никогда не очищается (известной как утечка памяти ). Предотвращение утечек памяти полностью не является одной из гарантий Rust, так же как и запрет гонок данных во время компиляции, то есть утечки памяти безопасны в Rust. Мы можем видеть, что Rust допускает утечки памяти, используя Rc<T> и RefCell<T>: можно создавать ссылки, где элементы ссылаются друг на друга в цикле. Это приводит к утечкам памяти, поскольку счетчик ссылок каждого элемента в цикле никогда не достигнет 0, а значения никогда не будут сброшены.

Существуют альтернативы, такие как «слабые указатели», которые позволили бы вам создавать структуры со ссылками на себя, которые можно было бы очистить даже после удаления. Фактически, использование Weak<T> на самом деле предлагается позже в этой главе.

Почему Rust считает это безопасным? Почему это тот случай, когда язык ничего не делает для предотвращения «плохого поведения программиста»?

1 Ответ

7 голосов
/ 13 мая 2019

Потому что это безопасно.


unsafe имеет очень специфическое значение в Rust, оно специально предназначено для классов ошибок программирования, которые вызывают Неопределенное поведение . Это самые неприятные ошибки, поскольку они полностью подрывают все ваше понимание программы, позволяя компилятору или аппаратному обеспечению вести себя непредсказуемым образом.

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

Вас может заинтересовать то, что Nomicon (Небезопасный эквивалент Книги Ржавчины) может сказать о Утечка ; пример о ScopeGuard часто называют Leakpocalypse.


Примечательно, что языки со сборкой мусора могут, например, легко пропускать память. Простой Map, в котором пары ключ-значение добавляются без удаления, в конечном итоге приведет к исчерпанию кучи; и GC не сможет остановить его.

Постоянно растущий Map столь же нежелателен, как неоднократно забывать free указатель, в любом случае вырисовывается куча исчерпания, но в целом языки GC считаются безопасными.

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