Anatoly
На своих-то, но такие ошибки могут стоить недели дебага
ну я примерно тоже самое сказал, но хозяин - барин
Micktu 😬
умение предугадыавть ошибки и подстелить сена - это исключительно опыт
Micktu 😬
так же как и обратная сторона, понимание где подстилать не нужно
Micktu 😬
я конечно пока что полностью этого лишен
Micktu 😬
@anatolijs дай, пожалуйста, пример кода, как бы ты защитил такой кусок
Micktu 😬
size_t outSize; uint8_t *buffer; mrb_dump_irep(mrb, irep, 0, &buffer, &outSize); char *p = (char *)buffer; char_vector_t out(p, p + outSize); mrb_free(mrb, buffer); mrb_close(mrb); return out;
Micktu 😬
вот это было реально полезным финальным аккордом в обсуждении
Nikita
умение предугадыавть ошибки и подстелить сена - это исключительно опыт
Тогда выучи и повторяй перед сном Valgrid наш, на светится memchecker твой, да прибудет vm твоя
Anatoly
а mrb как определен?
Micktu 😬
mrb_state*
Aleksei
Micktu 😬
да, это так
Micktu 😬
но Анатолий же сейчас говорит о НЕПРЕДВИДЕННОМ
Artem
ну так главное тут обработать код ошибки mrb_dump_irep
Aleksei
Если ему не удалось выделить память, то дальше при создании вектора ( не знаю, что за тип) может быть исключение
Artem
еще если mrb открывается вне функции, то и закрывать его надо вне функции, не надо такого рода менеджмент вносить внутрь обработчика
Micktu 😬
он открывается в функции
Micktu 😬
черт, мне нужен экстеншн вс для гиста, щас поставлю
Micktu 😬
поставил
Micktu 😬
https://gist.github.com/micktu/946460a2a30ce74df57d1d85767356ca
Micktu 😬
вот вся функция
Anatoly
ну, хотя бы на коленках defer: size_t outSize = 0; uint8_t *buffer = nullptr; mrb_state* mrb = nullptr; mrb_dump_irep(mrb, irep, 0, &buffer, &outSize); std::unique_ptr < mrb_state, std::function<void(mrb_state*)» holder(mrb, [](mrb_state*mrb) { mrb_close(mrb); }); std::unique_ptr < uint8_t, std::function<void(uint8_t*)» holder(buffer, [&mbr](uint8_t *buffer) { mrb_free(mrb, buffer); }); char *p = (char *)buffer; char_vector_t out(p, p + outSize);
Micktu 😬
сколько боли
Micktu 😬
вы привыкли к этой бесчеловечности?
Anatoly
ну, во всяком случае все твои динамические ресурсы защищены
Anatoly
по хорошему надо было просто обертку на mbr_state написать и все
Anatoly
но ты же спешишь
Micktu 😬
да кстати я и не заметил что у меня указатель баффер не инициализирова
Micktu 😬
по хорошему надо было просто обертку на mbr_state написать и все
я напишу просто обертку над функциями загрузки и дампа скрипта
Micktu 😬
я напишу просто обертку над функциями загрузки и дампа скрипта
чтобы бизнес-логика не занималась открытиями и закрытиями мруби-контекста
Micktu 😬
там можно уже и ошибочки обработать, и плохие указатели поймать
Micktu 😬
std::unique_ptr < uint8_t, std::function<void(uint8_t*)>> holder(buffer, [&mbr](uint8_t *buffer) { mrb_free(mrb, buffer); }); за это спасибо, научился
Micktu 😬
вообще не умею еще с++-указатели, не пользовался. знаю о них и не более
Micktu 😬
это стандарт?
Anatoly
но defer стандарными средствами :)
Anatoly
но действительно многолословный
Micktu 😬
щас будет реальн тупой вопрос
Micktu 😬
[&mbr] что значит этот синтаксис
Micktu 😬
ничего не понял!
Anatoly
захват контекта лямбдой
Micktu 😬
а, блин, это лямбда
Micktu 😬
господи!
Anatoly
и передача туда ссылки на объект mbr
Micktu 😬
да, все очевидно
Micktu 😬
тупак
Micktu 😬
окей, юник поинтер с декструкторм нравится
Micktu 😬
возьму на вооружение
Шаурма
масштабирования не вижу, но нужно побороть смещение https://gist.github.com/nib952051/df30e6fea374f54d83768d48031e805d
Micktu 😬
еще по чисто красивостям вопрос
Micktu 😬
если я хочу по-простому распарсить и трансформировать строку, что шустрее всего - просто пройти по символам в строке записывая каждый в стрингстрим?
Micktu 😬
кстати я сказал слово трансформировать и дошло что можно написать трансформ
Micktu 😬
это куда проще
Micktu 😬
спасибо
Micktu 😬
(на самом деле мне нужны функции котораые заменяет \r?\n на буквальное "\n" и наоборот)
Micktu 😬
(регекс ооочччень медленный)
Micktu 😬
не очень по теме чата, понимаю
Micktu 😬
это совсем осноовы :)
Micktu 😬
просто был вопрос как оптимально работать с такими сиутациями и не упустил ли я какой-то магии которая лучше чем копирование в стрингстрим посимвольно
Micktu 😬
ваще стрингстрим медленный, вроде, если память не проблема, можно просто аллоцировать массив 2хдлины оригинала и копировать в него
Micktu 😬
так и поступлю
Micktu 😬
красота
Micktu 😬
что может быть лучше простых алгоритмов
Micktu 😬
правда лучше не рефренс а значение в ренже
Крылатый
А если заимплементировать в функциональном стиле?
Dumitru
А еще лучше конст реф)
Micktu 😬
состязание
Micktu 😬
я предпочитаю декларативный потому что он быстрый
Micktu 😬
даже в других языках
babysitter
А еще лучше конст реф)
для чара зачем реф и тем более конст реф?
Крылатый
str_t это элиас на string?
Micktu 😬
А еще лучше конст реф)
ты об аргументе? да там должен быть конст реф
Micktu 😬
а я говорил что надо не char &c а char c
Micktu 😬
чуток побыстрее будет если компилятор не догадается оптимизировать
Micktu 😬
(инб4 догадается)
Micktu 😬
str_t это элиас на string?
угу, это стд::стринг
Крылатый
Оки.