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

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

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

25 ответов

6 просмотров

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

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

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

@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
еще вопрос, допустим мы создадим char массив из 10 элементов и присвоим ему через сканф 10 символов. и выведем все символы. Хотел спросить последний элемент /0 будет включать...
Anthem
11
открыть папку в проводнике: 1 - ShellExecute 2 - ExecuteProcess 3 - OpenDocument что лучше выбрать?
Alexey Kulakov
12
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Карта сайта