Re[5]: [PURE C] Почему замена RAII, а не реализация???
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 17.11.11 11:28
Оценка:
Здравствуйте, sts, Вы писали:


E>>А в то, что состояние структуры "все поля 0" может требовать что-то ещё освобоить я не верю

sts>Ну, для файлов скажем это не 0, а -1.

Значит, потребуется явная инициализация не-нулём.

sts>А дальше можно отправиться к примеру в man pthread_spin_init и там прочитать:

sts>

sts> If the pthread_spin_init(pthread_spinlock_t *lock) function fails, the lock is not initialized and the contents of lock are undefined.

sts>Понаписали вот. Теперь мучайся

На это надо заводить отдельную переменную типа lock_inited. Поставить её в 0 в общем начале и в 1 при успешной инициализации, мягко говоря, не проблема (по сравнению с общей задачей)
The God is real, unless declared integer.
Re: [PURE C] Закат Солнца вручную: замена RAII ???
От: andrey.desman  
Дата: 17.11.11 13:54
Оценка: 6 (1)
Здравствуйте, sts, Вы писали:


http://rsdn.ru/forum/cpp/2904863.aspx
Автор: andrey.desman
Дата: 06.04.08
Re[13]: [PURE C] Закат Солнца вручную: замена RAII ???
От: Erop Россия  
Дата: 17.11.11 15:05
Оценка:
Здравствуйте, igna, Вы писали:

I>То есть твое "в С типов нет" было не по делу?

То есть не можешь что-то сказать по теме топика? -- не флуди...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: [PURE C] Почему замена RAII, а не реализация???
От: Erop Россия  
Дата: 17.11.11 15:13
Оценка: +1
Здравствуйте, sts, Вы писали:

sts>>>Мне эти подходы не особо нравятся.

E>>А чем goto error_N плох?

sts>как минимум при изменениях кода едет нумерация меток.

sts>да и витиевато выходит.
А! Понял. Обычно в рамках этого подхода меткам стараются давать осмысленные названия. Типа там "выход после того", "выход после сего".
А если не могут, то нумеруют, но номера никакого смысла не имеют. Номера могут идти в любом поряке...


sts>тут уже предложили ++stage с последующим switch (stage) для решения этой проблемы.

sts>но, кажется, при этом становится еще витиеватее
IMHO это ожнозначно хуже.
Тогда уж лучше завести слово битов и взводить биты, соответствующие тем переменным, которые уже построены...
А эти ++ -- это одноначно дорога в ад.

E>>>>Но если вы жить не можете без RAII, ну заведите себе RAII!


sts>кто только их не понаписал за 40-то лет.



sts>Ну, для файлов скажем это не 0, а -1.

Ну и что?
sts>Понаписали вот. Теперь мучайся
Ну флажок рядом клади...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: [PURE C] Закат Солнца вручную: замена RAII ???
От: igna Россия  
Дата: 17.11.11 15:43
Оценка:
Здравствуйте, Erop, Вы писали:

E>То есть не можешь что-то сказать по теме топика? -- не флуди...


Спрашивающему-то я ответил подробно. А пройти мимо, когда говорят неправду, можно конечно, но в данном случае не нужно. Что это тебя так заело? Ну сказал глупость, ну поправили тебя, так на то и форум.
Re: [PURE C] Закат Солнца вручную: замена RAII ???
От: Alexéy Sudáchen Чили  
Дата: 18.11.11 01:54
Оценка: 9 (2)
Здравствуйте, sts, Вы писали:

sts>Всем привет.


sts>Вопрос как лучше обеспечить освобождение ресурсов в C ?

sts>Ниже на вскидку 3 способа.

foo4 — авторелиз пул

sts>Все способы, как кажется, — жесть какая-то


четвёртый на практике выглядит где-то так

YOYO_XDATA *Xtmpl_Load_Template(char *tmpl_home, char *tmpl_name)
  {
    YOYO_XDATA *doc = Xdata_Init();
    
    __Auto_Release
      {
        YOYO_BUFFER *bf;
        char *tmpl_source = Str_Join_2('/',tmpl_home,tmpl_name);
        bf = Cfile_Read_All(Cfile_Open(tmpl_source,"r"));
        Xnode_Value_Set_Str(&doc->root,"home",tmpl_home);
        Xnode_Value_Set_Str(&doc->root,"source",tmpl_source);
        Xtmpl_Macro_Template(&doc->root,bf->at,0);
      }
      
    return doc;
  }

...

YOYO_XDATA *Xtmpl_Cache_Template(char *root, char *S, char *lang)
  {
    YOYO_XDATA *doc = 0;
    YOYO_DICTO *dt = Xtmpl_Autoload_Dicto();
    void *reco = Dicto_Get(dt,S,&doc);
    if ( reco != &doc )
      doc = reco;
    else
      {
        __Try
          {
            YOYO_XNODE *n;
            doc = Xtmpl_Load_Template(root,S);
            if ( lang ) 
              {
                n = Xnode_Insert(&doc->root,"set");
                Xnode_Value_Set_Str(n,"$","#language");
                n = Xnode_Insert(n,"text");
                Xnode_Value_Set_Str(n,"$",lang);
              }
          }
        __Catch(YOYO_ERROR_DOESNT_EXIST) ;
        Dicto_Put(dt,S,__Refe(doc)); /* doc can be NULL */
      }
    return doc;
  }


Что такое __Auto_Release и __Try можно посмотреть на гитхабе
https://github.com/alexeysudachen/libyoyo/blob/master/yoyo.hc
Re[2]: [PURE C] Закат Солнца вручную: замена RAII ???
От: Константин Л. Франция  
Дата: 20.11.11 18:03
Оценка:
Здравствуйте, Alexéy Sudáchen, Вы писали:

[]

AS>Что такое __Auto_Release и __Try можно посмотреть на гитхабе

AS>https://github.com/alexeysudachen/libyoyo/blob/master/yoyo.hc

жесть
Re: [PURE C] Закат Солнца вручную: замена RAII ???
От: Константин Л. Франция  
Дата: 20.11.11 18:06
Оценка:
Здравствуйте, sts, Вы писали:

[]

давно ничего не писал сюда.

я бы для каждой структуры написал пару foo_ctor/foo_dtor.
внутри можно четко проинициализировать, проверить и освободить.
еще вариант с goto хорош. вот только никаких stages, только именные метки.
Re[2]: [PURE C] Закат Солнца вручную: замена RAII ???
От: sts  
Дата: 21.11.11 06:15
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, sts, Вы писали:


КЛ>[]


КЛ>давно ничего не писал сюда.


КЛ>я бы для каждой структуры написал пару foo_ctor/foo_dtor.

КЛ>внутри можно четко проинициализировать, проверить и освободить.
КЛ>еще вариант с goto хорош. вот только никаких stages, только именные метки.

Прижилось разделение кода функции на 2 части — которя выделяет-удаляет ресурсы и вызывает функцию реализующую алгоритм передавая ей готовые ресурсы в параметрах. С именными метками тоже не очень получается, пока рулят флажки xxx_initialized и goto на единственную метку где эти флажки проверяются.

А вообще получается, что единый поход (кроме своего RAII, как в YOYO) выработать сложно. В каждом конкретном случае свой подход рулит.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.