В Пнд, 23/03/2009 в 18:26 +0300, Artem Chuprina пишет:
> Покотиленко Костик -> debian-russian@lists.debian.org  @ Fri, 20 Mar 2009 
> 13:50:42 +0000:
> 
>  >>  >>  >> И на каждое выделение памяти.  Вверх по всему стеку вызовов.
>  >>  >> 
>  >>  >>  ПК> Если не увлекаться вызовом malloc() inline, а каждый "объект"
>  >>  >>  ПК> делать набор функций create, destroy и т.д. то это не много и
>  >>  >>  ПК> оправдано.  Кстати, разделяя функционал от интерфейса и выделив
>  >>  >>  ПК> библиотеку, так даже проще.
>  >>  >> 
>  >>  >> Любая попытка выделить память может закончиться неудачей.  И 
> называется
>  >>  >> она malloc() или create - рояля не играет.  Ну, с точностью еще до
>  >>  >> классических грабель "объективизации" конструкции, описанных во всех
>  >>  >> книжках по C++ - "что будет, если ошибка произойдет в момент, когда
>  >>  >> память выделена под _часть_ подобъектов?"
>  >> 
>  >>  ПК> Если ты программист Си - решать тебе что будет.
>  >> 
>  >> Не вопрос.  Но существует только один приемлемый способ решения -
>  >> аккуратно очистить все, что успело выделиться до этого момента.  В
>  >> случае с C - вручную отследив, что же успело выделиться.
> 
>  ПК> Что значит успело выделиться? Само оно не выделяется, по крайней
>  ПК> мере в Си.
> 
> На примере gtk.
> 
> Как ты создаешь композитный виджет?  Создаешь внутренние, и делаешь им
> add.  По очереди.  Если у тебя обломалость по недостатку памяти создание
> второго внутреннего виджета, ты перед возвратом должен только прибить
> внешний.  А вот если обломался его add, то удаления внешнего для
> освобождения памяти внутреннего недостаточно - он же не добавился.  Надо
> его destroy вручную.  И так с каждым.

Вопрос интересный:
void gtk_container_add(...);
void gtk_box_pack_start (...);
void gtk_table_attach(...);

Ни одна не возвращает результат. Варианта 2: либо добавление не требует
выделения ресурсов и обломов быть не может, либо таки об ошибке мы и не
узнаем. Прям сейчас не скажу как именно оно работает, но на практике у
меня таких обломов не встречалось. Если, конечно, добавлять то, что
заведомо реально добавить.

С другой стороны, даже если добавление обломается, ты об этом узнаешь
через вывод GTK-WARNING:... что при тестировании вылазит сразу.

>  >>   Нет, тут тоже
>  >> существует обходной маневр.  Ценой определенной дисциплины организации
>  >> функций, пары-тройки макросов для поддержки оной дисциплины и нескольких
>  >> дополнительных строчек на каждое выделение.
> 
>  ПК> Так и получается когда программист не знает "как оно
>  ПК> работает". Тогда да, и само выделяется, и выслеживать надо.
> 
> А, ты предпочитаешь просто забить на утечки памяти?

Ни в коем случае.

>  >>  ПК> Мне, например, не нравится как такие ситуации отработал
>  >>  ПК> spamassassin написанный на perl.  Смотри тред "OOM-Killer". С
>  >>  ПК> perl'ом даже OOM-Killer не справился.
>  >> 
>  >> А это - проблема, перпендикулярная.  Если тебе в сишной программе
>  >> понадобилась память - ты ее точно так же будешь запрашивать.
> 
>  ПК> Один раз, потом верну ошибку назад по стеку, там пусть решают что
>  ПК> делать.
> 
> А там пожмут плечами и начнут следующую итерацию главного цикла.  В
> которой снова запросят память...

Это вопрос логики, просто на perl'е проверки вообще суть не популярная,
если они там хотя бы есть в достаточном количестве.

>  >>  ПК> У Perl'а своя ниша, и он хорош пока от туда не вылазит.
>  >> 
>  >> Не вопрос.  Она у него даже малость поуже, чем у C.  Проблема в том, что
>  >> C из своей ниши вылазит...
> 
>  ПК> Посмотрим что успешно пишут на Си: драйвера, демоны, серверные,
>  ПК> клиентские, десктопные приложения, и т.д.
> 
> То-то у меня ipw2200 не работает больше полутора суток, firefox через
> неделю работы приходится прибивать kill -9, потому что на штатное
> завершение ему получаса не хватает, а у тебя snmpd жрет 10% CPU...

Молодец, перечислил все 3 корявые программы на Си :)

> Но почему драйвера пишут на C и почему криптографию пишут на ассемблере
> с сишной обвязкой, хотя бы можно обосновать.  Рантайм от более серьезных
> языков там действительно слишком тяжел.  А все остальное - не от
> большого ума.

Я тебе на это скажу так: высокоуровневым/скриптовым языкам легко/быстро
учиться, на них легко/быстро написать "первую версию". Их программисты
очень часто этим и ограничиваются. А когда начинаешь дорабатывать,
писать обработки различных ситуаций, тогда сложность и затраченное время
уравнивается.

>  >>  >> Ты на sh тоже как на C пишешь?  (Там, впрочем, если писать аккуратно,
>  >>  >> это бывает оправдано...)
>  >> 
>  >>  ПК> А это как?
>  >> 
>  >> command
>  >> if [[ $? == ... ]]; then
>  >> ...
>  >> fi
>  >> 
>  >> И т.п.  Это если "как писать".  Если "когда оправдано" - вместо пайпов
>  >> использовать временные файлы, потому что классический sh умеет вернуть
>  >> код только последней команды в пайпе, успех завершения остальных
>  >> проверить невозможно.  В bash или zsh можно, но тоже очень
>  >> небесплатно...  (На самом деле сейчас придет Чеусов и скажет, что на
>  >> классическом sh тоже можно - но ты попроси его тогда этот код показать,
>  >> он у него, кажется, есть...)
> 
>  ПК> Иногда приходится и так писать. Спорить не буду, на perl' было бы легче.
> 
> На перле, кстати, тоже иногда подобные танцы приходится устраивать.  По
> счастью, редко.

Вот тебе и доля правды о "шило на мыло".

-- 
Покотиленко Костик <cas...@meteor.dp.ua>


-- 
To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Ответить