172 похожих чатов

А как в расте принято работать с переполнением памяти? Например,

судя по коду, Vec будет кидать панику если не удалось выделить память. Как понимаю кроме нестабильных методов Vec::try_reserve и Vec::try_reserve_exact остаётся только вариант с отловом и обработкой паники?

25 ответов

21 просмотр

Там не паника, а вызов alloc_error_hook. Отловить его в стейбле не получится

Есть оом хендлер, и собственно все. С переполнение ничего особо не сделать нигде в общем случае

Kirill-Kuzminykh Автор вопроса
Αλεχ Zhukovsky
Есть оом хендлер, и собственно все. С переполнение...

Я просто переписываю на Rust код C-шной библиотеки, и там malloc просто возвращает пустой указатель если не удалось выделить память. На это стоит проверка и функция возвращает соответствующий результат. Т.е. на C библиотека не роняет полностью всё приложение из-за того что ей не хватило памяти.

Если хочешь обрабатывать переполнение памяти - выделяй память самостоятельно через alloc.

Kirill-Kuzminykh Автор вопроса
Dmytro Polunin
Если хочешь обрабатывать переполнение памяти - выд...

Уж лучше перехватить панику или сделать oom хендлер в одном месте, чем переписывать реализацию Vec.

Kirill Kuzminykh
Уж лучше перехватить панику или сделать oom хендле...

Смотри, если у тебя микроконтроллеры у тебя все равно no_std. В каком другом случае нужно обрабатывать недостаток памяти? Я не могу придумать такой ситуации.

Kirill-Kuzminykh Автор вопроса
Dmytro Polunin
Смотри, если у тебя микроконтроллеры у тебя все ра...

Нет, у меня обычные сервера с веб-приложениями, которые в том числе занимаются ресайзингом картинок, и было бы неплохо что бы нехватка памяти на resize не роняла всё приложение.

Kirill Kuzminykh
Нет, у меня обычные сервера с веб-приложениями, ко...

Ну если тебе надо тупо решить задачу то тебе помогут эвенты и проверять количество памяти. И ждать пока освободиться

Kirill Kuzminykh
Уж лучше перехватить панику или сделать oom хендле...

Overcommit может привести к тому, что будет не паника при выделении памяти, а SIGKILL от оом-киллера.

Kirill Kuzminykh
Нет, у меня обычные сервера с веб-приложениями, ко...

Тогда есть предложение создавать новый поток для ресайзинга. Тогда паниковать будет только тот тред.

Kirill Kuzminykh
Нет, у меня обычные сервера с веб-приложениями, ко...

Если это в одном месте происходит, то могу такое предложить: выдели память через std::alloc::alloc вручную, обработай nullptr и уже тогда делай Vec:from_raw

Kirill-Kuzminykh Автор вопроса
Mikail Bagishov
Если это в одном месте происходит, то могу такое п...

Хм, а это вариант. Спасибо - рассмотрю это решение если припрёт.

Mikail Bagishov
Если это в одном месте происходит, то могу такое п...

Это если ты знаешь сколько тебе памяти надо

Kirill-Kuzminykh Автор вопроса
Αλεχ Zhukovsky
Это если ты знаешь сколько тебе памяти надо

Я знаю, это же ресайз картинок - там все размеры известны заранее.

Αλεχ Zhukovsky
Это если ты знаешь сколько тебе памяти надо

Ну мне кажется, что требуемое место для изображения можно посчитать

Kirill Kuzminykh
Я знаю, это же ресайз картинок - там все размеры и...

Ну тогда вариант вот этот. Я бы предложил но не думал что тебе только этот сценарий нужен

Kirill-Kuzminykh Автор вопроса
Αλεχ Zhukovsky
Ну тогда вариант вот этот. Я бы предложил но не ду...

Да, согласен, наверное это преждевременно. Я просто увидел эту обработку в C-коде и решил в Rust тоже её сделать, но понял что это не так просто реализовать сейчас.

Kirill Kuzminykh
Да, согласен, наверное это преждевременно. Я прост...

да, я выше линканул пропозал. Пока что не сделали ничего для этого

Kirill-Kuzminykh Автор вопроса
Αλεχ Zhukovsky
да, я выше линканул пропозал. Пока что не сделали ...

Ну, вроде как у вектора есть нестабильные методы try_reserve и try_reserve_exact, которые возвращают Result. Что-то видимо да сделали.

Kirill Kuzminykh
Ну, вроде как у вектора есть нестабильные методы t...

я про решение вопроса в общем случае. Ну и это не поможет если у тебя вектор боксов и очередной бокс сделать не вышло)

Kirill Kuzminykh
Да, согласен, наверное это преждевременно. Я прост...

Ну, не так уж чтобы очень сложно. По крайней мере для Box<[T]> https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fa3f3b2afe68ab94bb53efed88ab004e Там правда утечка памяти на панике в T::default(). Так что всё-таки не просто.

red75prime
Ну, не так уж чтобы очень сложно. По крайней мере ...

так вроде поменьше ансейфа ) https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=e79821a1792aa63db672e56dfa7d4a25

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта