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

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

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

25 ответов

18 просмотров

Там не паника, а вызов 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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта