судя по коду, Vec будет кидать панику если не удалось выделить память. Как понимаю кроме нестабильных методов Vec::try_reserve и Vec::try_reserve_exact остаётся только вариант с отловом и обработкой паники?
Там не паника, а вызов alloc_error_hook. Отловить его в стейбле не получится
Есть оом хендлер, и собственно все. С переполнение ничего особо не сделать нигде в общем случае
Я просто переписываю на Rust код C-шной библиотеки, и там malloc просто возвращает пустой указатель если не удалось выделить память. На это стоит проверка и функция возвращает соответствующий результат. Т.е. на C библиотека не роняет полностью всё приложение из-за того что ей не хватило памяти.
Если хочешь обрабатывать переполнение памяти - выделяй память самостоятельно через alloc.
Уж лучше перехватить панику или сделать oom хендлер в одном месте, чем переписывать реализацию Vec.
Смотри, если у тебя микроконтроллеры у тебя все равно no_std. В каком другом случае нужно обрабатывать недостаток памяти? Я не могу придумать такой ситуации.
Нет, у меня обычные сервера с веб-приложениями, которые в том числе занимаются ресайзингом картинок, и было бы неплохо что бы нехватка памяти на resize не роняла всё приложение.
Ну если тебе надо тупо решить задачу то тебе помогут эвенты и проверять количество памяти. И ждать пока освободиться
Overcommit может привести к тому, что будет не паника при выделении памяти, а SIGKILL от оом-киллера.
Тогда есть предложение создавать новый поток для ресайзинга. Тогда паниковать будет только тот тред.
Если это в одном месте происходит, то могу такое предложить: выдели память через std::alloc::alloc вручную, обработай nullptr и уже тогда делай Vec:from_raw
Хм, а это вариант. Спасибо - рассмотрю это решение если припрёт.
abort убивает процесс целиком
Это если ты знаешь сколько тебе памяти надо
Я знаю, это же ресайз картинок - там все размеры известны заранее.
Ну мне кажется, что требуемое место для изображения можно посчитать
Ну тогда вариант вот этот. Я бы предложил но не думал что тебе только этот сценарий нужен
Да, согласен, наверное это преждевременно. Я просто увидел эту обработку в C-коде и решил в Rust тоже её сделать, но понял что это не так просто реализовать сейчас.
да, я выше линканул пропозал. Пока что не сделали ничего для этого
Ну, вроде как у вектора есть нестабильные методы try_reserve и try_reserve_exact, которые возвращают Result. Что-то видимо да сделали.
я про решение вопроса в общем случае. Ну и это не поможет если у тебя вектор боксов и очередной бокс сделать не вышло)
Ну, не так уж чтобы очень сложно. По крайней мере для Box<[T]> https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa3f3b2afe68ab94bb53efed88ab004e Там правда утечка памяти на панике в T::default(). Так что всё-таки не просто.
какая утечка для типа размером 0?
так вроде поменьше ансейфа ) https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e79821a1792aa63db672e56dfa7d4a25
Обсуждают сегодня