Ioann_
После malloc надо бы проверять возвращаемое им значение, мало ли памяти не хватило или еще чего :]
Ioann_
Endp startp - можно и нужно делать константными
ГуНиСе️
Мотивация: в случае нехватки памяти программа всё равно завершится. Так как какая разница из-за чего это произойдёт
Ioann_
Ну, хех. Не знаю, мне затруднительно ответить стоит или нет.
ГуНиСе️
из-за разыменования NULL или чуть более красиво
Ioann_
Пойдет в null и там уже аборт
Ioann_
Или что там бросает
Ioann_
А так можно обработать
ГуНиСе️
ну разные бывают стратегии обработки ошибок...
Ioann_
И продолжить использование
ГуНиСе️
кое-кто вон сразу завершает свою программу, если что-то пошло не так
Ioann_
Более того туда еще и запись делается :}
Vladislav
Мотивация: в случае нехватки памяти программа всё равно завершится. Так как какая разница из-за чего это произойдёт
тем более что на современных (64-битных) системах память закончится сильно раньше, тк malloc возвращает null nолько когда кончится виртуальная память
Ioann_
Ну я так поправил человека. Чтобы просто понимал, что там есть ошибки и неточности :) А уж что с ними делать ...
ГуНиСе️
Ну я так поправил человека. Чтобы просто понимал, что там есть ошибки и неточности :) А уж что с ними делать ...
а я к тому, что не все рассматривают отсутствие проверки результата malloc как ошибку
Ioann_
Ну так можно сказать про любую ошибку ...
Ioann_
Я не рассматриваю эту ошибку как ошибку и пусть компилятор меня остановит, а коли нет - то падите от моего меча !
ГуНиСе️
Ну так можно сказать про любую ошибку ...
ну разве что кроме переполнения буфера 😉
ГуНиСе️
тогда возможны уязвимости
Ioann_
ну разве что кроме переполнения буфера 😉
Ой там же еще есть доступ к константной памяти и т.п не помню как называется...
Ioann_
Ладно всем хорошей ночи, а я продолжать работать !
cyberzx 🇷🇺
Не видел ни разу стратегий обработки нулл в маллок, при которой программа не завершается. Буду благодарен за пример
Evgenii
реально а че делать если память закончилась, кроме как сеппуку?)
Berkus
ну разные бывают стратегии обработки ошибок...
если вместо malloc использовать new то можно и не проверять
Berkus
реально а че делать если память закончилась, кроме как сеппуку?)
освободить, у тебя может быть например пачка pooled allocators и какой-то пул который ты можешь дропнуть целиком в случае нехватки памяти
ГуНиСе️
Не видел ни разу стратегий обработки нулл в маллок, при которой программа не завершается. Буду благодарен за пример
Давайте рассмотрим какой-нибудь текстовый редактор, сферический в вакууме. Я думаю, в приложениях подобного плана есть смысл в случае нехватки памяти выдать диалог пользователю, мол "извините, нет памяти". Проблема в том, что malloc ничего не скажет об этой ситуации. Нужно учесть некоторые её особенности работы.
ГуНиСе️
https://scvalex.net/posts/6/
ГуНиСе️
Malloc never fails. Правда это настраивается параметром vm.overcommit_memory
ГуНиСе️
http://helpers.com.ua/linux/overcommit-memory/
Anatoly
https://www.youtube.com/watch?v=6nsyX37nsRs&feature=youtu.be #metaclasses #sutter
Александр
видели, читали..
vladislav
еее, в стандарт плюсов что-то дельное предлагают https://herbsutter.com/2017/07/26/metaclasses-thoughts-on-generative-c/
Алдар
у петона подсмотрели?
vladislav
а, сорян, тут уже вкинули)
Крылатый
Опять он со своей норкоманией)
vladislav
Крылатый
Но $class больше на PHP похоже.
Александр
я джва года жду такого
vladislav
то чувство, когда в плюсы подъезжают технологии из начала 70-х
Крылатый
Вопрос! Что это означает? auto x[] = { 0, 1 };
Крылатый
Согласно современному стандарту, да.
Александр
Баян
Крылатый
Всего один день, а уже боян?(
Александр
Такова жизнь :(
Александр
Но тут не обсуждалось ещё
Nik
Вопрос! Что это означает? auto x[] = { 0, 1 };
Я так понимаю, ответ не тривиальный?
Крылатый
Mikhail
error: 'x' declared as array of 'auto'
Mikhail
c флагом std=c++11
Крылатый
Крылатый
error: 'x' declared as array of 'auto'
Ой вей С C++17 тоже не собирается.
Stanislav
Mikhail
судя по логам низя массив объявлять как auto
Mikhail
auto x = {0, 1}; std::cout « typeid(x).name() « std::endl; вообще выдает St16initializer_listIiE компилил clang'ом
Mikhail
что в очередной раз показывает что не стоит юзать auto где он не нужен
Dr. Friedrich
Для auto без массива ещё можно было бы догадаться.
Ioann_
Кстати, о вчерашнем коде.
Ioann_
Ну, тем у кого есть время и желание: Смотрите, у вас есть строка p, она содержит n символов. При том в некоторой позиции содержит стророку вида "abc...."
Anatoly
Конечно, не решение, но массив auto: template<typename T, size_t N> using array = T[N]; int main() { auto&& a = array<int, 2>{1, 2}; std::cout << typeid(a).name(); }
Mikhail
лично я стараюсь использовать auto в случае если явно известен тип переменной. чтобы просто сэкономить местно. всякие конструкции типа auto x = {0, 1} или short a = 2, b = 3; auto с = a + b не совсем однозначны.. компилятором не гарантируется что они будут приведены к типу int вообще, на всех аппаратных платформах.
Ioann_
Ну, тем у кого есть время и желание: Смотрите, у вас есть строка p, она содержит n символов. При том в некоторой позиции содержит стророку вида "abc...."
То есть функция такая void f(char* p, char* out); вот в строку out вам надо спарсить то, что лежит в кавычках. Как бы вы это сделали :?
Ioann_
Т.е что бы по обращению к out, можно было получить то что в кавычечках строки p.
Anatoly
судя по сигнатуре, ты в out должен передать уже выделенный под результат буфер
Anatoly
поэтому только копированием в out того, что находится в кавычках
Anatoly
если бы возврат из функцию предполагал пару указателей, то ничего бы выделять и копировать не пришлось
Ioann_
А почему именно возврат это определяет :?
Anatoly
передать в параметр char* в теле функции ты ничего не можешь, поскольку здесь указатель передан по значению, поэтому только записать можешь данные по этому указателю, а так я не понял твой вопрос.
Ioann_
Ну я полагал вот такое решение: while(++p != '"'); out = p; while(++p != '"'); *--p = 0;
Ioann_
т.е копирования не нужно.
Anatoly
out невозможно изменить так, чтобы это стало доступно вызывающей стороне
Ioann_
Да, надо ссылку добавить - мой косяк
Anatoly
в этом случае сигнатура должна быть другой: void foo(char *in, char*& out);