<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834942</guid>
        <pubDate>Wed, 22 Jul 2020 17:39:59 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834942</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834845'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T00:37:01+00:00">22.07.20, 00:37</time></span><div class='quote '>Это всем апологетам RAII так хочется видеть. Потом начинаются конструкторы, деструкторы, смартпоинтеры ...а у меня всего лишь скромная метка для goto.</div></div><br>
Так с меткой goto код становится сложнее. Хотя бы потому, что у меня в коде ее просто не существует.<br>
С конструкторами, деструкторами и смартпоинтерами код становится проще :) <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Ты просто еще не проникся дзеном простоты, не понимаешь всего величия и фундаментальности безусловных переходов&#33; :lol: </div></div><br>
Я когда-то вполне себе писал на чистом си и использовал паттерн с goto для очистки ресурсов. И код такой видел часто. Но в си выбора нет.<br>
С RAII же все в разы проще. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T20:42:59+03:00">22.07.20, 17:42</time></span></span><br>
Более того, в питоне я использую with. И в других языках я так же предпочитаю использовать управление ресурсами, максимально приближенное к автоматическому.<br>
RAII тут лучше всего. Ну разве что bracket pattern с ним может поспорить. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T17:43:41+00:00">22.07.20, 17:43</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834935'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T16:26:36+00:00">22.07.20, 16:26</time></span><div class='quote '>Для некоторых личностей - скорее цель ;)</div></div><br>
Тебе кажется. Тут конкретная задача - управление ресурсами. RAII как раз для этого.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834935</guid>
        <pubDate>Wed, 22 Jul 2020 16:26:36 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834935</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834924'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T14:48:00+00:00">22.07.20, 14:48</time></span><div class='quote '>Это не цель, а средство вообще-то.</div></div><br>
Для некоторых личностей - скорее цель ;)]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834925</guid>
        <pubDate>Wed, 22 Jul 2020 14:57:17 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834925</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834860'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T06:48:51+00:00">22.07.20, 06:48</time></span><div class='quote '>Субъективизм</div></div>А то. Вот представь, что ты увидел в продакшне вот сие:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;std::wostream(&amp;std::wbuffer_convert&#60;std::codecvt_utf8_utf16&#60;wchar_t&#62;&#62;(std::cout.rdbuf())) &#60;&#60;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;static_cast&#60;std::wostringstream&amp;&amp;&#62;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::wostringstream() &#60;&#60; std::wostream(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&amp;std::wbuffer_convert&#60;std::codecvt_utf16&#60;wchar_t, 0x10FFFF, std::little_endian&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#62;(std::ifstream(&quot;u16.txt&quot;).rdbuf())</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;).rdbuf()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;).str()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#60;&#60; std::endl;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script> :blink: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T15:01:10+00:00">22.07.20, 15:01</time></span></span><br>
Ведь круто в одну строку выдать на консоль файл в UTF-16, кастанув на лету в UTF-8?]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834924</guid>
        <pubDate>Wed, 22 Jul 2020 14:48:00 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834924</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834833'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:31:35+00:00">21.07.20, 22:31</time></span><div class='quote '>Кстати, я иногда поражался способности некоторых людей быстро анализировать сложный запутанный код с большим количеством переходов и пр.</div></div><br>
Это да. Я, например, хочу мозг, способный удерживать в голове <a class='tag-url' href='https://raw.githubusercontent.com/jspjut/lugaru/master/Source/GameTick.cpp' target='_blank'>вот такой</a> код :D (<a class='tag-url' href='https://store.steampowered.com/app/25010/Lugaru_HD/' target='_blank'>вот эта</a> игра). <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T14:49:01+00:00">22.07.20, 14:49</time></span></span><br>
И кстати, <strong class='tag-b'>JoeUser</strong>-у на заметку - даже в таком коде нет ни одного goto  :D <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T14:53:06+00:00">22.07.20, 14:53</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834834'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:31:46+00:00">21.07.20, 22:31</time></span><div class='quote '>только с одной целью - впилить туда всеми правдами и неправдами RAII</div></div><br>
Это не цель, а средство вообще-то.]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834863</guid>
        <pubDate>Wed, 22 Jul 2020 07:14:34 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834863</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834845'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T00:37:01+00:00">22.07.20, 00:37</time></span><div class='quote '>Это всем апологетам RAII так хочется видеть. Потом начинаются конструкторы, деструкторы, смартпоинтеры ...а у меня всего лишь скромная метка для goto. Ты просто еще не проникся дзеном простоты, не понимаешь всего величия и фундаментальности безусловных переходов&#33; </div></div><br>
Это все можно сравнить со стиркой. У тебя подход какой - ты постирал все вещи, что были прям кучей - носки/белое/черное/цветное/джинсы/футболки там всякие - вытащил всю эту кучу из машинки, и бросил на полку. Вот твой подход. Дальше придет время взять шмотку - будешь рыться искать.<br>
Подход RAII - во первых стирать все по отдельности носки - отдельно, белое отдельно от черного, цветное отдельно, затем после стирки ты все вещи достаешь, выглаживаешь, и раскладываешь по полочкам, футболки к футболкам, брюки к брюкам, аккуратно сортируешь носки, засовываешь носок в носок(чтоб потом парные не искать), после чего раскладываешь на полочку.<br>
<br>
Вот примерно этим отличается твой подход от подхода RAII. Да в случае с RAII - приходится сортировать и выглаживать, чтоб потом пришел - взял что тебе нужно, пошел. А с твоим подходом - оно то с виду может и быстрее взять кучу одежды с машинки и кидануть на полку, только потом ты всеравно потратишь то же самое время, а то и больше - на поиск вещи и на ее глажку. Не понимаю как можно не понимать столь очевидных вещей.  :-? <br>
Написание даже полноценного RAII класса выходит быстрее - чем выделение ресурса руками, потом проверка всех условий, потом переход по метке(это же еще понять нужно где ее правильно воткнуть надо будет, чтоб и лишней не было и мало не было), и освобождение его руками.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834860</guid>
        <pubDate>Wed, 22 Jul 2020 06:48:51 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834860</link>
        <description><![CDATA[Gonarh: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834847'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T02:49:40+00:00">22.07.20, 02:49</time></span><div class='quote '>Если я смотрю код, и он прекрасен, значит всё было сделано правильно.</div></div><br>
Субъективизм. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T06:49:17+00:00">22.07.20, 06:49</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834847'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T02:49:40+00:00">22.07.20, 02:49</time></span><div class='quote '><span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T02:50:13+00:00">22.07.20, 02:50</time></span></span><br>
:jokingly: А если он ещё и работает...</div></div><br>
А вот это правильно  :lol:]]></description>
        <author>Gonarh</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834847</guid>
        <pubDate>Wed, 22 Jul 2020 02:49:40 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834847</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834845'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T00:37:01+00:00">22.07.20, 00:37</time></span><div class='quote '>Ты просто еще не проникся дзеном простоты, не понимаешь всего величия и фундаментальности безусловных переходов&#33;</div></div>Посмею напомнить, что искусство программирования называется внезапно искусством. Код должен быть не просто правильным, он должен быть ещё и красивым.<br>
Лично мне вот пофик, кто где как какие паттерны заюзал. Если я смотрю код, и он прекрасен, значит всё было сделано правильно. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T02:50:13+00:00">22.07.20, 02:50</time></span></span><br>
:jokingly: А если он ещё и работает...]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834845</guid>
        <pubDate>Wed, 22 Jul 2020 00:37:01 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834845</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834843'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T00:11:24+00:00">22.07.20, 00:11</time></span><div class='quote '>Твой способ не быстрее и не проще способа с RAII, скорее наоборот.</div></div><br>
Это всем апологетам RAII так хочется видеть. Потом начинаются конструкторы, деструкторы, смартпоинтеры ...а у меня всего лишь скромная метка для goto. Ты просто еще не проникся дзеном простоты, не понимаешь всего величия и фундаментальности безусловных переходов&#33; :lol: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-22T00:40:47+00:00">22.07.20, 00:40</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834843'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T00:11:24+00:00">22.07.20, 00:11</time></span><div class='quote '>Это как с принципом избегать преждевременной оптимизации. Принцип прекрасен, но он не отменяет того факта, что не стоит и &quot;пессимизировать&quot;, т.е. если у тебя есть два одинаковых по сложности способа что-то сделать, то логично выбрать тот, что оптимальнее. Это не будет преждевременной оптимизацией.</div></div><br>
И я с тобой согласен тут. Но это если действительно одно лучше другого. А если нет? Только Бритва Оккама и спасает.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834843</guid>
        <pubDate>Wed, 22 Jul 2020 00:11:24 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834843</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834842'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-22T00:04:28+00:00">22.07.20, 00:04</time></span><div class='quote '>В каждом конкретном случае.</div></div><br>
Согласен.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Но при такой практически нулевой вероятности - предусматривать последующий рефакторинг как минимум странно. Лучше уж к врачу паранойю лечить :) </div></div><br>
Так тебе никто не предлагает обмазаться всеми паттернами проектирования и пытаться предусмотреть изменения :) <br>
Твой способ не быстрее и не проще способа с RAII, скорее наоборот.<br>
<br>
Это как с принципом избегать преждевременной оптимизации. Принцип прекрасен, но он не отменяет того факта, что не стоит и &quot;пессимизировать&quot;, т.е. если у тебя есть два одинаковых по сложности способа что-то сделать, то логично выбрать тот, что оптимальнее. Это не будет преждевременной оптимизацией.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834842</guid>
        <pubDate>Wed, 22 Jul 2020 00:04:28 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834842</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834841'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T23:48:25+00:00">21.07.20, 23:48</time></span><div class='quote '>То есть как бы ты ни собирал требования, как бы ни проектировал, все равно будут меняться требования и все равно нужно будет менять софт</div></div><br>
Ну надо же быть реалистом&#33; В каждом конкретном случае. Да - неизменного нет. Начиная проектировать свою обертку, я задаюсь вопросом &quot;какова вероятность, что процесс логина в SFTP сервер в ближайшее время изменится?&quot; Исходные данные: &quot;14 августа 2006 года было принято решение о прекращении работы над развитием протокола в связи с выполнением основной задачи проекта&quot;. Вывод: вероятность внесения новых изменений или требований - минимальная, если им только не взбредет в голову возобновить проект. Да, &quot;никогда не говори никогда&quot;. Ну тогда мне, а вернее не мне, немножко не повезет. Но при такой практически нулевой вероятности - предусматривать последующий рефакторинг как минимум странно. Лучше уж к врачу паранойю лечить :) <br>
<br>
<strong class='tag-b'>Wound</strong>, Киля, астанавись&#33;&#33;&#33; :lol: Я тебя услышал. Выложу код, форкнешь и покажешь мне свое минималистическое количество строк.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834841</guid>
        <pubDate>Tue, 21 Jul 2020 23:48:25 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834841</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834836'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:50:08+00:00">21.07.20, 22:50</time></span><div class='quote '>Раз пришлось потом что-то менять - значит это тебе урок: не ленись на начальном проектировании&#33;</div></div><br>
Нет :) Мир сложнее, чем ты думаешь. Если быть кратким и использовать модель Кеневин, то разработка софта почти всегда находится в запутанном домене, а не в сложном. То есть как бы ты ни собирал требования, как бы ни проектировал, все равно будут меняться требования и все равно нужно будет менять софт (если только мы политически его не законсервировали). Поэтому лучше как раз при проектировании направить усилия на возможность адаптации и поддержки. Ну в том случае, если речь не о hello world.<br>
Собственно, большая часть паттернов проектирования на это направлено, как и большая часть современных инженерных практик в области софта (юнит-тесты, *DD, CI/CD и пр.), да и принципов тоже (KISS, DRY, противостояние over engineering). <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T23:51:23+00:00">21.07.20, 23:51</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834836'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:50:08+00:00">21.07.20, 22:50</time></span><div class='quote '>Да не вопрос. Я может быть его и на гитхаб выкину (кстати, переписываю его без Qt), . Потому как норм библиотеки для SFTP нету. А платные я покупать не намерен&#33; Вот там и форкнешь.</div></div><br>
:good: <br>
<br>
А у тебя уже есть какие-то проекты выложенные?<br>
<br>
Я только собираюсь начать в эту сторону идти, есть пара идей на поиграться. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T23:52:34+00:00">21.07.20, 23:52</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834836'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:50:08+00:00">21.07.20, 22:50</time></span><div class='quote '>Нет, это единый процесс&#33; :) Полу-логина не бывает.</div></div><br>
Я про отделение логики от возни с ресурсами. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T23:54:31+00:00">21.07.20, 23:54</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834840'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T23:20:26+00:00">21.07.20, 23:20</time></span><div class='quote '>Тебе рассказывают про то, что хорошо бы работу с отдельными ресурсами вынести в отдельные классы, у тебя бы в таком случае код сократился бы в пять раз в твоей вырвиглазной функции, ты бы отделил логику работы приложения от логики работы с ресурсом, тем самым упростив понимание задачи.</div></div><br>
:good:]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834840</guid>
        <pubDate>Tue, 21 Jul 2020 23:20:26 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834840</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834831'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:09:17+00:00">21.07.20, 22:09</time></span><div class='quote '>Если добрались, все эти ресурсы в полях класса висят без какого-то использования, только для удаления.</div></div><br>
Что тебе мешает объявить эти ресурсы не в полях класса, а там где конкретно они нужны? Тогда они сразу же и удаляться, как только перестанут быть нужными.<br>
В общем или лыжи не едут или я <span class="tag-color tag-color-named" data-value="red" style="color: red">censored</span>  :-? <br>
Тебе рассказывают про то, что хорошо бы работу с отдельными ресурсами вынести в отдельные классы, у тебя бы в таком случае код сократился бы в пять раз в твоей вырвиглазной функции, ты бы отделил логику работы приложения от логики работы с ресурсом, тем самым упростив понимание задачи.<br>
Тут работы на максимум на пару часов, и того меньше, а ты третьи сутки сидишь - и то у тебя не так, и это у тебя не эдак.<br>
<br>
Да тут даже вот взять если втупую не думая твой код скопипастить в класс, получается куда лучше и понятнее чем у тебя сейчас есть.<br>
Допустим на примере сессии:<br>
Какая то примитивная обертка(тупо взял все вызовы твоих функций и вынес в метод класса сессии):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">struct SLibssh2_session</div><div class="code_line">{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SLibssh2_session()</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; m_session = libssh2_session_init();</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (!m_session) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; sftpError = sftp_error::session_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; throw &quot;session is not initialized...&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;~SLibssh2_session()</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;libssh2_session_disconnect(m_session, &quot;Normal Shutdown, Thank you for playing!&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;libssh2_session_free(m_session);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;void SetBanner(const std::string&amp; banner)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; if(!libssh2_session_banner_set(m_session, banner.c_str()))</div><div class="code_line">&nbsp;&nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::session_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw &quot;can&#39;t set baner...&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;void Handshake(int socket)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; if (libssh2_session_handshake(m_session, socket)) </div><div class="code_line">&nbsp;&nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::handshake_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw &quot;handshake_error...&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;void SetBlocking(int blocking)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; // перевод в неблокируемый режим</div><div class="code_line">&nbsp;&nbsp; &nbsp; libssh2_session_set_blocking(m_session, blocking);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">//! Эти методы возможно должны быть вынесены в другой класс, лень заморачиваться, просто ради показать идею.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;std::string HostKeyHash(int flag)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; return libssh2_hostkey_hash(m_session, flag);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp;void LoginByUserPwd(const char* login, const char* pwd)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;int ret = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;while ((ret = libssh2_userauth_password(m_session, login, pwd)) == LIBSSH2_ERROR_EAGAIN);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (ret) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::auth_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw &quot;error during LoginByUserPwd...&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;void LoginByPublickey_frommemory(...)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while ((ret = libssh2_userauth_publickey_frommemory(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_session,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Auth-&#62;login.toLocal8Bit().data(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Auth-&#62;login.length(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Auth-&#62;public_array.data(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Auth-&#62;public_array.size(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Auth-&#62;private_array.data(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Auth-&#62;private_array.size(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Auth-&#62;password.toLocal8Bit().data()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)) == LIBSSH2_ERROR_EAGAIN);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (ret) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::auth_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Error in LoginByPublickey_frommemory...&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; LIBSSH2_SESSION* m_session;</div><div class="code_line">}</div></ol></div></div></div></div><br>
Использование, при этом логика твоего приложения никак не изменилась:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">void mov::qt::sftp_class::slotLogin() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct addrinfo hint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct addrinfo *addrs;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct sockaddr_in *sin;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const char *fingerprint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct addrinfo *p;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int ret;</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool found;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sftpError = sftp_error::no;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (sftpState == sftp_state::ready &amp;&amp; Auth-&#62;authState == auth_state::ok) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// инициализация библиотеки</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (libssh2_init(0) != 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::libssh2_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// поиск адреса хоста</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memset(&amp;hint, 0, sizeof(hint));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;hint.ai_flags = AI_NUMERICHOST;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;hint.ai_family = AF_UNSPEC;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;hint.ai_socktype = SOCK_STREAM;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;hint.ai_protocol = IPPROTO_TCP;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret = getaddrinfo(Host.toLocal8Bit().data(), NULL, &amp;hint, &amp;addrs);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (ret == EAI_NONAME) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;hint.ai_flags = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ret = getaddrinfo(Host.toLocal8Bit().data(), NULL, &amp;hint, &amp;addrs);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (ret != 0) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::resolve_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto cleanup_libssh2_init;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;found = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (p = addrs; p != nullptr; p = p-&#62;ai_next) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (p-&#62;ai_family == AF_INET) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;found = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sin = reinterpret_cast&#60;sockaddr_in *&#62;(p-&#62;ai_addr);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (!found) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::ip4_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto cleanup_libssh2_init;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// создание сокета</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sock = socket(AF_INET, SOCK_STREAM, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (sock == INVALID_SOCKET) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::socket_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto cleanup_libssh2_init;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sin-&#62;sin_family = AF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sin-&#62;sin_port = htons(Port);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// коннект</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ret = ::connect(sock, (struct sockaddr *)(sin), sizeof(struct sockaddr_in));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (ret != 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::connect_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto cleanup_socket;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">//======================Было=============================================</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// создание сессии</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// session = libssh2_session_init();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// if (!session) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// sftpError = sftp_error::session_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// goto cleanup_socket;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// // установка баннера</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// if (libssh2_session_banner_set(session, &quot;SSH-2.0-OpenSSH_LIBSSH2_1.9.0&quot;) != 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// sftpError = sftp_error::session_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// goto cleanup_session;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// // рукопожатие</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// if (libssh2_session_handshake(session, sock)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// sftpError = sftp_error::handshake_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// goto cleanup_session;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// // перевод в неблокируемый режим</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// libssh2_session_set_blocking(session, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// получение отпечатка</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//fingerprint = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// авторизация</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// if (Auth-&#62;authType == auth_type::login) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// while ((ret = libssh2_userauth_password(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// session,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;login.toLocal8Bit().data(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;password.toLocal8Bit().data()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// )) &nbsp; == LIBSSH2_ERROR_EAGAIN);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if (ret) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// sftpError = sftp_error::auth_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// goto cleanup_session;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// } else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// while ((ret = libssh2_userauth_publickey_frommemory(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// session,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;login.toLocal8Bit().data(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;login.length(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;public_array.data(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;public_array.size(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;private_array.data(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;private_array.size(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Auth-&#62;password.toLocal8Bit().data()</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// )) == LIBSSH2_ERROR_EAGAIN);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if (ret) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// sftpError = sftp_error::auth_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// goto cleanup_session;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// }</div><div class="code_line">&nbsp;</div><div class="code_line">//=======================Стало============================================ </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SLibssh2_session session;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;session.SetBanner(&quot;SSH-2.0-OpenSSH_LIBSSH2_1.9.0&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;session.Handshake(sock);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;session.SetBlocking(0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fingerprint = HostKeyHash(LIBSSH2_HOSTKEY_HASH_SHA1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (Auth-&#62;authType == auth_type::login) </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;session.LoginByUserPwd(Auth-&#62;login.toLocal8Bit().data(), Auth-&#62;password.toLocal8Bit().data());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;session.LoginByPublickey_frommemory(...);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;catch(const char* error)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">//==================================================================== &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// инициализация ftp-сессии</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sftp_session = libssh2_sftp_init(session);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!sftp_session) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (libssh2_session_last_errno(session) == LIBSSH2_ERROR_EAGAIN)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;waitsocket(sock, session);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sftpError = sftp_error::auth_error;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;goto cleanup_session;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} while (!sftp_session);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// все четко и дерзко</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sftpState = sftp_state::logged_in;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// аварийная очистка</div><div class="code_line">// &nbsp; &nbsp;cleanup_session:</div><div class="code_line">// &nbsp; &nbsp; &nbsp; &nbsp;libssh2_session_disconnect(session, &quot;Normal Shutdown, Thank you for playing!&quot;);</div><div class="code_line">// &nbsp; &nbsp; &nbsp; &nbsp;libssh2_session_free(session);</div><div class="code_line">&nbsp;&nbsp; &nbsp;cleanup_socket:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; #ifdef WIN32</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;closesocket(sock);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; #else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;close(sock);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; #endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;cleanup_libssh2_init:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;libssh2_exit();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T23:27:39+00:00">21.07.20, 23:27</time></span></span><br>
Разнеси оставшиеся ресурсы с очистками по классам, у тебя от функции останется 40 очевидных строк, которые будут понятны с полувзгляда.<br>
Обертки сами - они так же примитивные, по сути отдельные операции суешь в методы, выделение ресурса - конструктор, удаление - деструктор. <br>
Посмотри на получившийся класс - там сразу видно что это тупо обертка над Си функциями, ошибки детектятся мгновенно, т.к. каждая функция в отдельном методе, и если что можно сосредоточится на методе в 5 строк, нежели на функции в 200 строк вырвиглазного кода. Ошибку в 5 строках кода - найти проще, чем в 200 строках. Т.е. по сути класс ниочемный, но тем не менее - он логику работы с твоей сессией сократил в 3-4 раза.<br>
А если еще прикрутить логирование, в каждый метод, то тут как бы вообще даже если и будет какой то баг, то его без отладки найти будет дело трех минут. В твоем коде не то что бы отладка, тут без двух литров не обойтись чтоб понять где там что произошло.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834836</guid>
        <pubDate>Tue, 21 Jul 2020 22:50:08 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834836</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834834'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:31:46+00:00">21.07.20, 22:31</time></span><div class='quote '>Можешь потом код класса скинуть? Может на RAII переведу, чтоб была полная картина для спора.</div></div><br>
Да не вопрос. Я может быть его и на гитхаб выкину (кстати, переписываю его без Qt), . Потому как норм библиотеки для SFTP нету. А платные я покупать не намерен&#33; Вот там и форкнешь.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834835'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:35:14+00:00">21.07.20, 22:35</time></span><div class='quote '>Это не лапша</div></div><br>
Нет, это лапша&#33; :) <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834835'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:35:14+00:00">21.07.20, 22:35</time></span><div class='quote '>Это не единый процесс</div></div><br>
Нет, это единый процесс&#33; :) Полу-логина не бывает. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T22:54:39+00:00">21.07.20, 22:54</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834835'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:35:14+00:00">21.07.20, 22:35</time></span><div class='quote '>Вот тебе нужно будет поменять что-то в коде load</div></div><br>
Для это изначально нужно тщательнее продумывать. И решать лучше проблемы по мере поступления. Раз пришлось потом что-то менять - значит это тебе урок: не ленись на начальном проектировании&#33;]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834835</guid>
        <pubDate>Tue, 21 Jul 2020 22:35:14 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834835</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834834'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:31:46+00:00">21.07.20, 22:31</time></span><div class='quote '>Лапша в коде - это генерация &quot;автономных&quot; RAII там, где это неуместно.</div></div><br>
Это не лапша, потому что это уже другой код, он к функции load не имеет отношения прямого. Можно отдельно писать (даже разными людьми) и затем поддерживать.<br>
Вот тебе нужно будет поменять что-то в коде load. Тебе придется заново обдумывать, не сломалось ли чего. Мне не придется. У меня логика работы с ресурсами отделена. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T22:38:01+00:00">21.07.20, 22:38</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834834'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:31:46+00:00">21.07.20, 22:31</time></span><div class='quote '>Во всех мануалх и бест-практиках твердят: используйте инструментарий там, где это уместно.</div></div><br>
Да, RAII уместно использовать для работы с ресурсами.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>искусственное разбиение единого процесса</div></div><br>
Это не единый процесс, ИМХО.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Короче. Возвращаюсь к goto. Ваши попытки - неубедительны :lol:</div></div><br>
Да кто ж тебе мешает-то? :) <br>
<br>
Можешь потом код класса скинуть? Может на RAII переведу, чтоб была полная картина для спора.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834834</guid>
        <pubDate>Tue, 21 Jul 2020 22:31:46 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834834</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834832'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:13:13+00:00">21.07.20, 22:13</time></span><div class='quote '>А если речь об указателях (т.е. ресурсы в виде указателей у тебя), то тебе не нужно писать классы-обертки. Достаточно unique_ptr и typedef/using</div></div><br>
Ну у меня почти поровну разных. Первые два - только &quot;факт&quot; что промежуточная инициализация прошла (чтобы потом финализировать). Третий - нужно сразу удалить память после и не хранить. А вот остальные три - указатели на различные структуры.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834832'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:13:13+00:00">21.07.20, 22:13</time></span><div class='quote '>Если тебе нравится лапша в коде, то кто ж тебе помешает?</div></div><br>
Лапша в коде - это генерация &quot;автономных&quot; RAII там, где это неуместно. Во всех мануалх и бест-практиках твердят: используйте инструментарий там, где это уместно. Так вот тут, я считаю, лапша  - это искусственное разбиение единого процесса, только с одной целью - впилить туда всеми правдами и неправдами RAII. И лапша и костыли - вот это и есть такое навязывание. Короче. Возвращаюсь к goto. Ваши попытки - неубедительны :lol:]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834833</guid>
        <pubDate>Tue, 21 Jul 2020 22:31:35 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834833</link>
        <description><![CDATA[D_KEY: Кстати, я иногда поражался способности некоторых людей быстро анализировать сложный запутанный код с большим количеством переходов и пр.<br>Это задача не для средних умов явно.<br>А я в таком коде точно сделаю кучу багов и буду не способен поддерживать его уже через пару дней после написания.<br><br>Так что для таких как я остается только декомпозировать, максимально упрощать, делать небольшие блоки, которые отвечают за что-то одно, максимально автоматизировать, писать юнит-тесты и т.д. и т.п.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834832</guid>
        <pubDate>Tue, 21 Jul 2020 22:13:13 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834832</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834831'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:09:17+00:00">21.07.20, 22:09</time></span><div class='quote '>Если добрались, все эти ресурсы в полях класса висят без какого-то использования, только для удаления.</div></div><br>
Так ведь именно так и будет в том случае, который тебе предлагают :) Я так и не понял что тебе не нравится.<br>
<br>
А если речь об указателях (т.е. ресурсы в виде указателей у тебя), то тебе не нужно писать классы-обертки. Достаточно unique_ptr и typedef/using <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T22:15:01+00:00">21.07.20, 22:15</time></span></span><br>
Тут ведь что важно. Код всяких load станет проще и чище. Да, за счет дополнительных утилитарных структурок/typedef. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T22:16:14+00:00">21.07.20, 22:16</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834831'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T22:09:17+00:00">21.07.20, 22:09</time></span><div class='quote '>Поэтому - гвардов вполне достаточно, хоть и таких мудреных с if-фами.</div></div><br>
Если тебе нравится лапша в коде, то кто ж тебе помешает? :D <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T22:21:44+00:00">21.07.20, 22:21</time></span></span><br>
<strong class='tag-b'>JoeUser</strong>, еще я понял, что есть разница в восприятии у нас. Ты как будто весь код целиком смотришь. Потому для тебя и нет разницы, где ресурс будет освобожден, в коде функции load или в отдельном объекте-владельце, даже второй случай кажется тебе более сложным. Я же предпочитаю декомпозировать. И мне важнее, что код load более простой и чистый, не замылен лапшой с очисткой ресурсов.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834831</guid>
        <pubDate>Tue, 21 Jul 2020 22:09:17 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834831</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834819'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T17:54:41+00:00">21.07.20, 17:54</time></span><div class='quote '>(например, если это не единственное место, где нужны эти ресурсы)</div></div><br>
Вооо, вернулись к началу начал  :lol: Сколько я уже страниц бъюсь, пытаюсь объяснить - для моего примера важно только конечное состояние при выделении этих всех ресурсов&#33; А именно , добрались ли мы до логина в SFTP или нет. Если добрались, все эти ресурсы в полях класса висят без какого-то использования, только для удаления. И, по-сути, их все можно считать одним ресурсом. Ибо &quot;частичный&quot; логин  (например, создали сокет, а соединиться не можем) смысла не имеет, и все откатываем в начало. Поэтому - гвардов вполне достаточно, хоть и таких мудреных с if-фами.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834819</guid>
        <pubDate>Tue, 21 Jul 2020 17:54:41 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834819</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834802'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T12:14:33+00:00">21.07.20, 12:14</time></span><div class='quote '>Ну уж если решил дробить, будь добр выделять не более чем по одному ресурсу на владельца. </div></div><br>
Я не знаю, как лучше сделать конкретно в твоей программе. Если это имеет смысл (например, если это не единственное место, где нужны эти ресурсы), то выноси. А так я сделал только по числу меток cleanup и чисто для демонстрации того, как это сделает здоровый плюсовик, а не плюсовик курильщика.]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834814</guid>
        <pubDate>Tue, 21 Jul 2020 16:55:11 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834814</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834809'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T15:38:01+00:00">21.07.20, 15:38</time></span><div class='quote '>С посимвольным чтением на libc и POSIX ты конечно отмочил&#33; :lool:</div></div>Ненуачё. Ему можно тролить, мне нельзя, что ль? :lol: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T16:59:33+00:00">21.07.20, 16:59</time></span></span><br>
И это ещё как посмотреть, кто тролил, а кто нет. Формально только rdbuf() по определению читает всё скопом, хоть и всё рано не знает, сколько там. А вот istream_iterator совместно с back_insert уже на подобное не способны, и то, что ты видишь, является оптимизацией уровня библиотеки. Так что получите и распишитесь – libc и ОС API наглядно демонстрируют возможности оптимизации: руками не оптимизируешь, хрен и получишь. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T17:06:06+00:00">21.07.20, 17:06</time></span></span><br>
Та и никто в здравом уме не будет выбирать конкретный интерфейс и свято ему следовать &quot;шаги по сторонам == расстрел&quot;. Нормальные пацаны берут все необходимые интерфейсы и юзают от каждого по потребности. Нужны блочные бинарные операции – std::ifstream::read(), нужны символьные форматирующие – std::basic_istream&lt;&gt;::operator&gt;&gt;(), понадобились файловые – std::filesystem, итп. Так что у него там по-любому синтетика, на практике бесполезная.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834809</guid>
        <pubDate>Tue, 21 Jul 2020 15:38:01 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834809</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834805'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T13:52:04+00:00">21.07.20, 13:52</time></span><div class='quote '>Та на. Почти не отличается от оригинала </div></div><br>
С посимвольным чтением на libc и POSIX ты конечно отмочил&#33; :lool: <br>
Тест же должен же был выявить максимальные скорости чтения. А ты им такую подляну кинул)<br>
<br>
Лучше бы два первых теста как-то забустил, типа:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">char Buffalo[64*1024*1024];</div><div class="code_line">...</div><div class="code_line">...</div><div class="code_line">std::string load1(const std::string&amp; path) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string buf;</div><div class="code_line">&nbsp;&nbsp; &nbsp;buf.reserve(std::filesystem::file_size(std::filesystem::path(path)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::ifstream file(path);</div><div class="code_line">&nbsp;&nbsp; &nbsp;file.rdbuf()-&#62;pubsetbuf(Buffalo, 64*1024*1024); // &#60;-------------------</div><div class="code_line">...</div><div class="code_line">...</div><div class="code_line">...</div></ol></div></div></div></div>]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834805</guid>
        <pubDate>Tue, 21 Jul 2020 13:52:04 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834805</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834766'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T00:08:58+00:00">21.07.20, 00:08</time></span><div class='quote '>Скинь, плс, исходники потестить.</div></div>Та на. Почти не отличается от оригинала :D <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;chrono&#62;</div><div class="code_line">#include &#60;algorithm&#62;</div><div class="code_line">#include &#60;memory&#62;</div><div class="code_line">#include &#60;iterator&#62;</div><div class="code_line">#include &#60;filesystem&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;fstream&#62;</div><div class="code_line">#include &#60;sstream&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;cstdio&#62;</div><div class="code_line">#include &#60;cstdlib&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">// Windows stuff</div><div class="code_line">#include &#60;io.h&#62;</div><div class="code_line">// Linux stuff</div><div class="code_line">#include &#60;sys/types.h&#62;</div><div class="code_line">/*#include &#60;sys/stat.h&#62;*/</div><div class="code_line">#include &#60;fcntl.h&#62;</div><div class="code_line">/*#include &#60;unistd.h&#62;*/</div><div class="code_line">&nbsp;</div><div class="code_line">std::string load1(const std::string&amp; path) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string buf;</div><div class="code_line">&nbsp;&nbsp; &nbsp;buf.reserve(std::filesystem::file_size(std::filesystem::path(path)));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::ifstream file(path);</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::copy((std::istreambuf_iterator&#60;char&#62;(file)), std::istreambuf_iterator&#60;char&#62;(), std::back_inserter(buf));</div><div class="code_line">&nbsp;&nbsp; &nbsp;return buf;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">std::string load2(const std::string&amp; path) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto ss = std::ostringstream(std::string(std::filesystem::file_size(std::filesystem::path(path)), &#39;&#39;));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::ifstream file(path);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ss &#60;&#60; file.rdbuf();</div><div class="code_line">&nbsp;&nbsp; &nbsp;return ss.str();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">std::string load3(const std::string&amp; path) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto close_file = [](FILE* f){fclose(f);};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto holder = std::unique_ptr&#60;FILE, decltype(close_file)&#62;(fopen(path.c_str(), &quot;rb&quot;), close_file);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!holder)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return &quot;&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FILE* f = holder.get();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (fseek(f, 0, SEEK_END) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return &quot;&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const long size = ftell(f);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (size &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return &quot;&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (fseek(f, 0, SEEK_SET) &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &quot;&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string res;</div><div class="code_line">&nbsp;&nbsp; &nbsp;res.resize(size, &#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// C++17 defines .data() which returns a non-const pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i = 0; i &#60; size; ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;fread(&amp;res[i], 1, 1, f);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return res;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">std::string load4(const std::string&amp; path) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int fd = open(path.c_str(), _O_RDONLY);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (fd &#60; 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &quot;&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct stat sb;</div><div class="code_line">&nbsp;&nbsp; &nbsp;fstat(fd, &amp;sb);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string res;</div><div class="code_line">&nbsp;&nbsp; &nbsp;res.resize(sb.st_size, &#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// C++17 defines .data() which returns a non-const pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i = 0; i &#60; sb.st_size; ++i)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;read(fd, &amp;res[i], 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;close(fd);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return res;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// --------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">class Test {</div><div class="code_line">&nbsp;&nbsp; &nbsp;const std::string path;</div><div class="code_line">&nbsp;&nbsp; &nbsp;const int k = 10;</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint64_t ref_time = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;Test(const std::string&amp; p) : path(p) {}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void run() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;measure(&quot;C++ istreambuf_iterator&quot;, &nbsp;load1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;measure(&quot;C++ stream::rdbuf&quot;, &nbsp; &nbsp; &nbsp; &nbsp;load2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;measure(&quot;libc fread&quot;, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; load3);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;measure(&quot;POSIX read&quot;, &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; load4);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;template &#60;typename FUNCTION&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void measure(const char* name, FUNCTION load_function) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;auto load = [this, &amp;load_function]() {return load_function(path);};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%-30s: &quot;, name); fflush(stdout);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;uint64_t time = -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (int i=0; i &#60; k; i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;time = std::min(time, measure(load));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;putchar(&#39;.&#39;); fflush(stdout);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot; %10llu us&quot;, time);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (ref_time == 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ref_time = time;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot; (%0.2f)&quot;, ref_time/double(time));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;putchar(&#39;\n&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;template &#60;typename FUNCTION, typename time_type = std::chrono::microseconds&#62;</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint64_t measure(FUNCTION fun) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;const auto ts = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;const auto s &nbsp;= fun();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;const auto te = std::chrono::high_resolution_clock::now();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;static volatile size_t size = s.size();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return std::chrono::duration_cast&#60;time_type&#62;(te - ts).count();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (int i=1; i &#60;= 32; i&#60;&#60;=1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;const std::string path = &quot;test&quot; + std::to_string(i) + &quot;.fil&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::ofstream(path.c_str(), std::ios::binary).write(&amp;*std::vector&#60;char&#62;(i*1024*1024).begin(), i*1024*1024);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;File %s\n&quot;, path.c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Test test(path);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;test.run();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834802</guid>
        <pubDate>Tue, 21 Jul 2020 12:14:33 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834802</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834801'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>OpenGL &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T11:55:39+00:00">21.07.20, 11:55</time></span><div class='quote '>Чем моё решение не устроило?</div></div><br>
Ну я уже  там выше Киле писал о дроблении класса sftp_class ... Ты реализовал вот так:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// ...</div><div class="code_line">// Сохранение локальных ресурсов в переменные класса</div><div class="code_line">&nbsp;&nbsp; &nbsp;session &nbsp;= std::move(local_session);</div><div class="code_line">&nbsp;&nbsp; &nbsp;socket &nbsp; = std::move(local_socket);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ssh_init = std::move(local_ssh);</div><div class="code_line">// ...</div></ol></div></div></div></div><br>
Ну уж если решил дробить, будь добр выделять не более чем по одному ресурсу на владельца. А их вот сколько вырисовывается:<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834791'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:03:57+00:00">21.07.20, 10:03</time></span><div class='quote '>1) winsock_class - WSAStartup /WSACleanup();<br>
2) libssh2_class - libssh2_init / libssh2_exit<br>
3) resolv_slass - getaddrinfo / freeaddrinfo      &lt;----------------- можно не хранить, т.к. резольвится один первый раз<br>
4) socket_class - socket / closesocket<br>
5) connect_class - connect / shutdown<br>
6) libssh2_session_init_class - libssh2_session_init / libssh2_session_free<br>
7) libssh2_sftp_sesstion_class - libssh2_sftp_init / libssh2_sftp_shutdown</div></div>]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834801</guid>
        <pubDate>Tue, 21 Jul 2020 11:55:39 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834801</link>
        <description><![CDATA[OpenGL: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834763'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T21:45:08+00:00">20.07.20, 21:45</time></span><div class='quote '>При чем тут вообще исключения? Вопрос в другом. В случае успешного прохождения полной цепочки инициализаций - ничего освобождать не нужно. После выхода из процедуры отдельные ресурсы должны оставаться валидными. Но, если не вся цепочка пройдена - вот тогда все ресурсы, захваченные до ошибки, должны быть освобождены.<br>
</div></div><br>
Чем моё решение не устроило?]]></description>
        <author>OpenGL</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834799</guid>
        <pubDate>Tue, 21 Jul 2020 11:36:05 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834799</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834797'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T11:28:25+00:00">21.07.20, 11:28</time></span><div class='quote '>Видел это. тут, кстати, недообернули)))</div></div><br>
Возможно, однако самую идею иллюстрирует.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834797</guid>
        <pubDate>Tue, 21 Jul 2020 11:28:25 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834797</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834796'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:49:40+00:00">21.07.20, 10:49</time></span><div class='quote '>Вот тебе еще пример RAII оберток для ssh</div></div><br>
<br>
Видел это. тут, кстати, недообернули)))<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifdef WIN32</div><div class="code_line">&nbsp;&nbsp;WSADATA wsadata;</div><div class="code_line">&nbsp;&nbsp;WSAStartup(MAKEWORD(2,0), &amp;wsadata); &#60;----------------это один ресурс в классе Session, и нужно чекать возврат </div><div class="code_line">#endif</div><div class="code_line">&nbsp;&nbsp; // Initialize libssh2 on a thread safe manner, count the session instances.</div><div class="code_line">&nbsp;&nbsp; libssh2::__libshh2_session_count_mutex.lock();</div><div class="code_line">...</div><div class="code_line">...</div><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp;this-&#62;_sess = libssh2_session_init(); &#60;------------- а это уже второй ресурс в классе Session</div></ol></div></div></div></div>]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834796</guid>
        <pubDate>Tue, 21 Jul 2020 10:49:40 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834796</link>
        <description><![CDATA[Wound: Вот посмотри как твоя задача(ну или подобная) решается с помощью RAII -&gt; <a class='tag-url' href='https://habr.com/ru/company/ispsystem/blog/430488/' target='_blank'>https://habr.com/ru/company/ispsystem/blog/430488/</a> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T10:51:37+00:00">21.07.20, 10:51</time></span></span><br>
В итоге весь твой код в функции размазывается на классы - это основная библиотека как бы выходит. А дальше ты уже с ними работаешь где тебе нужно. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T10:54:02+00:00">21.07.20, 10:54</time></span></span><br>
В итоге ты как бы разделяешь свой код на слои. Когда ты начинаешь юзать свои вот эти обертки - тебе уже совершенно не интересно что в них происходит, и ты сосредотачиваешься на алгоритме работы. Если где то произошла ошибка - она легко детектится и локализуется. <br>
<br>
А вот то что ты там налабал - это больше Сишный подход, и то там наверное свои паттерны имеются чтоб упростить подобную задачу. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T11:05:40+00:00">21.07.20, 11:05</time></span></span><br>
Вот тебе еще пример RAII оберток для ssh -&gt; <a class='tag-url' href='https://github.com/rubdos/libssh2pp/blob/master/libssh2.hpp' target='_blank'>https://github.com/rubdos/libssh2pp/blob/master/libssh2.hpp</a>]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834795</guid>
        <pubDate>Tue, 21 Jul 2020 10:42:23 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834795</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834793'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:22:00+00:00">21.07.20, 10:22</time></span><div class='quote '>Судя по тому что ты мне ответил - возникает ощущение, что не знаешь.</div></div><br>
Судя по тому, как ты судишь - ты не умеешь судить. 1-1 :) Ланна, <strong class='tag-b'>Киля</strong>, спасибо за участие, я тебя услышал&#33;  :good:   <br>
<strong class='tag-b'>D_KEY</strong>, и тебе спасибо :good:]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834793</guid>
        <pubDate>Tue, 21 Jul 2020 10:22:00 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834793</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834791'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:03:57+00:00">21.07.20, 10:03</time></span><div class='quote '>:blink: а то я не знаю? </div></div><br>
Судя по тому что ты мне ответил - возникает ощущение, что не знаешь.  :-? <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834791'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:03:57+00:00">21.07.20, 10:03</time></span><div class='quote '>1) Ты собираешь независимые ресурсы в свой wrapper (хотя логичнее назвать holder). У меня они зависимые. Т.е. результат одного передается в инициализацию другого. Но и это не главное.<br>
2) Один (или несколько, пока один) из ресурсов у меня &quot;временный&quot; и его хранить не нужно. Т.е. r1,rc2, rc3, rc4 проинициализировали, все rc3 уже не нужен, удалили, потом - rc5, rc6</div></div><br>
Совершенно не очевидно что у тебя там происходит, когда ты пишешь это словами. Но я не вижу пока каких либо проблем.  :-? <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834791'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:03:57+00:00">21.07.20, 10:03</time></span><div class='quote '>3) Ну и самое наверное важное - ты решил в свой wrapper запилить в конструкторе больше чем нужно. Т.е., как объект создается - так он сразу бежит логиниться. Такое мне не нужно&#33; </div></div><br>
Самое важное состоит в том, что мой пример решает исключительно твою задачу, которую ты описал выше, которую я якобы не понял. Я тебе написал это в таком виде исключительно с одной целью - чтоб ты понял идею. Я понятия не имею что у тебя там происходит и как оно с чем взаимодействует. Предполагалось, что ты возьмешь саму идею и применишь его к своему коду. Но ты видимо так ничего и не понял.<br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834791'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:03:57+00:00">21.07.20, 10:03</time></span><div class='quote '>Но я понимаю, к чему ты клонишь - раздербанить мой sftp_class в целую &quot;инфраструктуру&quot;, типа:<br>
<br>
winsock_class - WSAStartup /WSACleanup();<br>
libssh2_class - libssh2_init / libssh2_exit<br>
resolv_slass - getaddrinfo / freeaddrinfo<br>
socket_class - socket / closesocket<br>
connect_class - connect / shutdown<br>
libssh2_session_init_class - libssh2_session_init / libssh2_session_free<br>
libssh2_sftp_sesstion_class - libssh2_sftp_init / libssh2_sftp_shutdown</div></div><br>
Это не я к этому клоню - это принцип идиомы RAII. Один ресурс - одна обертка. В твоем случае у тебя тут выходит вот столько вот оберток, сколько ты тут написал. opn/close - один RAII класс/ну или смарт поинтер, в заивисимости от сложности реализации инициализации/уничтожения. Это вроде как стандартный подход  :-? <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834791'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:03:57+00:00">21.07.20, 10:03</time></span><div class='quote '>Потом мне придется писать такую же портянку исключений, чтобы понять кто бросил, и можно ли продолжить работу ( допустим сделать еще 3 попытки соединения)</div></div><br>
Данные нужно правильно структурировать, 3 попытки соединения ты можешь сделать в RAII обертке. А дальше, если у тебя соединение не прошло - кидать исключение/писать в лог, потому что на сколько я понимаю - дальнейшая работы с ресурсами лишена всякого смысла, соединение то не установлено. Дальше ты это исключение ловишь - где тебе нужно, пишешь его в лог/показываешь юзеру, и совершенно не паришься по поводу того - нужно тебе там что то освободить или нет.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834791'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T10:03:57+00:00">21.07.20, 10:03</time></span><div class='quote '>В результате вся эта &quot;правильность&quot; вылезает боком в увеличении кода и сложности взаимодействий. Пусть это четырежды правильнее - но самому находить работу, ради чистоты рассы, имхо - тупо и глупо&#33; Лучше уж костыли, чем велосипеды с мотором от трактора. </div></div><br>
Вся фишка в том, что у тебя получится структурированная, устойчивая к ошибкам, хорошо читаемая программа. Каждый ресурс изолирован в своей оболочке, которая заботится за ним. <br>
<br>
Я конечно понимаю, что когда ты привык везде писать goto и юзать сырые указатели, понять ценность такого подхода сложно. Это все в основном приходит с практикой наверное.  :-? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T10:22:27+00:00">21.07.20, 10:22</time></span></span><br>
Но я бы тебе советовал перейти на другой ЯП, желательно с GC, тебе не нужен С++, ты просто не юзаешь его фишки как бы  :-? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T10:25:42+00:00">21.07.20, 10:25</time></span></span><br>
Да хоть тот же Си юзай, он поди быстрее С++ и меньше памяти рантайм жрать будет.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834791</guid>
        <pubDate>Tue, 21 Jul 2020 10:03:57 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834791</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834779'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T07:27:02+00:00">21.07.20, 07:27</time></span><div class='quote '>Почитай как работает система исключений в С++ при конструировании объекта.</div></div><br>
 :blink: а то я не знаю? <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834779'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T07:27:02+00:00">21.07.20, 07:27</time></span><div class='quote '>На ка тебе пример еще в догонку, расскажи пожалуйста что тут работает не так, как ты описал? Очень интересно послушать.</div></div><br>
1) Ты собираешь независимые ресурсы в свой wrapper (хотя логичнее назвать holder). У меня они зависимые. Т.е. результат одного передается в инициализацию другого. Но и это не главное.<br>
2) Один (или несколько, пока один) из ресурсов у меня &quot;временный&quot; и его хранить не нужно. Т.е. r1,rc2, r<strong class='tag-b'>c3</strong>, rc4 проинициализировали, все rc3 уже не нужен, удалили, потом - rc5, rc6<br>
3) Ну и самое наверное важное - ты решил в свой wrapper запилить в конструкторе больше чем нужно. Т.е., как объект создается - так он сразу бежит логиниться. Такое мне не нужно&#33; <br>
<br>
Но я понимаю, к чему ты клонишь - раздербанить мой sftp_class в целую &quot;инфраструктуру&quot;, типа:<br>
<br>
winsock_class - WSAStartup /WSACleanup();<br>
libssh2_class - libssh2_init / libssh2_exit<br>
resolv_slass - getaddrinfo / freeaddrinfo<br>
socket_class - socket / closesocket<br>
connect_class - connect / shutdown<br>
libssh2_session_init_class - libssh2_session_init / libssh2_session_free<br>
libssh2_sftp_sesstion_class - libssh2_sftp_init / libssh2_sftp_shutdown<br>
<br>
Потом мне придется писать такую же портянку исключений, чтобы понять кто бросил, и можно ли продолжить работу ( допустим сделать еще 3 попытки соединения)<br>
<br>
В результате вся эта &quot;правильность&quot; вылезает боком в увеличении кода и сложности взаимодействий. Пусть это четырежды правильнее - но самому находить работу, ради чистоты рассы, имхо - тупо и глупо&#33; Лучше уж костыли, чем велосипеды с мотором от трактора. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T10:11:44+00:00">21.07.20, 10:11</time></span></span><br>
ADD: Нет, ну я понимаю, когда система сложная, когда сложно отследить все взаимодействия - тогда нет вопросов. Но при таком линейном выполнении городить огород, просто, чтобы &quot;соответствовало идеологии&quot;, не считаю это разумным.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834782</guid>
        <pubDate>Tue, 21 Jul 2020 08:02:18 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834782</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834781'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T07:46:39+00:00">21.07.20, 07:46</time></span><div class='quote '>Чем то похоже на идиому copy-and-swap</div></div><br>
Ну да. Что бы ни произошло в методе load, это не затронет состояние, пока работа не будет завершена. Сначала делаем все операции, которые могут привести к ошибке, потом меняем состояние (тут уже ошибок быть не может).<br>
<br>
Хотя конкретно тот мой код просто пример, а не реальный код.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834781</guid>
        <pubDate>Tue, 21 Jul 2020 07:46:39 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834781</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834769'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T02:35:05+00:00">21.07.20, 02:35</time></span><div class='quote '>Это передача владения ресурсом.</div></div><br>
Чем то похоже на идиому copy-and-swap <a class='tag-url' href='https://ru.wikipedia.org/wiki/Copy-and-swap' target='_blank'>https://ru.wikipedia.org/wiki/Copy-and-swap</a>]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834780</guid>
        <pubDate>Tue, 21 Jul 2020 07:32:18 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834780</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834775'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T06:26:32+00:00">21.07.20, 06:26</time></span><div class='quote '>Говоришь нет дурацких if&#39;ов</div></div><br>
Да, нет. Конкретно этот if не дурацкий, кроме того, его вполне может не быть, он там лишь для примера, чтоб ты мог управлять успешным/не успешным завершением.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>В твоем варианте - обеспечить передачу владения.</div></div><br>
В чем тут трудность или проблема-то? У ресурсов должны быть владельцы - это хороший подход, очень многие вещи упрощает.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Но раз, ты нагородил еще более моего</div></div><br>
Меньше  :) <br>
И код гораздо проще. И ошибиться в нем довольно сложно, гораздо сложнее, чем у тебя.<br>
<br>
Но кто я такой, чтобы мешать тебе продолжать писать говнокод? :D <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T07:36:10+00:00">21.07.20, 07:36</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834775'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-21T06:26:32+00:00">21.07.20, 06:26</time></span><div class='quote '>В моем варианте - обеспечить неудаление нужного. В твоем варианте - обеспечить передачу владения. Что по сути звучит. и то, и то одинаково: не потерять лишнее.</div></div><br>
Я не понимаю тебя, если честно.<br>
<br>
Давай начнем с простого.<br>
Вот это, на твой взгляд, одинаково &quot;звучит&quot;:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int * p = new 10;</div><div class="code_line">&nbsp;</div><div class="code_line">// ...</div><div class="code_line">&nbsp;</div><div class="code_line">delete p;</div></ol></div></div></div></div><br>
<br>
И<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">auto p = std::make_unique&#60;int&#62;(10);</div><div class="code_line">&nbsp;</div><div class="code_line">// ...</div></ol></div></div></div></div><br>
<br>
?]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834779</guid>
        <pubDate>Tue, 21 Jul 2020 07:27:02 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834779</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834763'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T21:45:08+00:00">20.07.20, 21:45</time></span><div class='quote '>Не разобравшись - советуешь&#33;<br>
При чем тут вообще исключения? Вопрос в другом. В случае успешного прохождения полной цепочки инициализаций - ничего освобождать не нужно. После выхода из процедуры отдельные ресурсы должны оставаться валидными. Но, если не вся цепочка пройдена - вот тогда все ресурсы, захваченные до ошибки, должны быть освобождены.</div></div><br>
Почитай как работает система исключений в С++ при конструировании объекта.<br>
На ка тебе пример еще в догонку, расскажи пожалуйста что тут работает не так, как ты описал? Очень интересно послушать.<br>
<a class='tag-url' href='https://ideone.com/SI8Kz6' target='_blank'>https://ideone.com/SI8Kz6</a><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">using namespace std;</div><div class="code_line">&nbsp;</div><div class="code_line">struct Resource</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Resource(int id)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;m_id = id;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(id == 3)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Error during initialize: id can&#39;t be 3&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;initialize resource with id: &quot; &#60;&#60; id &#60;&#60; std::endl;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;~Resource()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;Destroy Resource with id: &quot; &#60;&#60; m_id &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;int m_id;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">struct ResourceWrapper</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;ResourceWrapper(int id1, int id2, int id3, int id4, int id5)</div><div class="code_line">&nbsp;&nbsp; &nbsp;: m_rc1(id1),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;m_rc2(id2),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;m_rc3(id3),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;m_rc4(id4),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;m_rc5(id5)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; Resource m_rc1;</div><div class="code_line">&nbsp;&nbsp; Resource m_rc2;</div><div class="code_line">&nbsp;&nbsp; Resource m_rc3;</div><div class="code_line">&nbsp;&nbsp; Resource m_rc4;</div><div class="code_line">&nbsp;&nbsp; Resource m_rc5;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">int main() </div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;without errors:&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ResourceWrapper rc(5,6,7,8,9);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;==========================&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;with errors:&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ResourceWrapper rc(1,2,3,4,5);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;catch(const char* error)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;Error: &quot; &#60;&#60; error &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;// your code goes here</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834775</guid>
        <pubDate>Tue, 21 Jul 2020 06:26:32 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834775</link>
        <description><![CDATA[JoeUser: И у меня нет  &quot;дурацких флагов&quot;, есть описатели состояния. И goto уже нет. Говоришь нет дурацких if&#39;ов:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if (success) {</div><div class="code_line">&nbsp;&nbsp;init_.swap(init);</div><div class="code_line">});</div></ol></div></div></div></div><br>
По-моему уже пришли к вопросу бутерброда, с какой стороны правильно намазывать масло. В моем варианте - обеспечить неудаление нужного. В твоем варианте - обеспечить передачу владения. Что по сути звучит. и то, и то одинаково: не потерять лишнее. Но раз, ты нагородил еще более моего, обеспечивая, по сути, тоже самое - вот я и говорю. Антипаттерном попахивает.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834769</guid>
        <pubDate>Tue, 21 Jul 2020 02:35:05 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834769</link>
        <description><![CDATA[D_KEY: Это передача владения ресурсом.<br>Код простой, никаких дурацких флагов, if, goto, понятно, кто ресурсом владеет. Не надо даже деструктор у my_struct писать. Да даже guard и лямбд.<br>Просто сравни с твоей лапшой.<br><br>По поводу локальных объектов и обмена - гугли про безопасность исключений (на самом деле это касается любой обработки ошибок, если подумать). Если сам не найдешь толкового материала, я позже могу раскрыть тему.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834768</guid>
        <pubDate>Tue, 21 Jul 2020 01:41:58 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834768</link>
        <description><![CDATA[JoeUser: Не, это уже чересчур&#33; Еще и локальные переменные заводить дополнительно, потом их обменивать ... ради чего? Попахивает антипаттерном.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834767</guid>
        <pubDate>Tue, 21 Jul 2020 00:11:31 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834767</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834763'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T21:45:08+00:00">20.07.20, 21:45</time></span><div class='quote '>После выхода из процедуры отдельные ресурсы должны оставаться валидными. Но, если не вся цепочка пройдена - вот тогда все ресурсы, захваченные до ошибки, должны быть освобождены.</div></div><br>
Это решается путём передачи владения ресурсом полю или передачи его(владения) наружу. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T00:18:12+00:00">21.07.20, 00:18</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834763'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T21:45:08+00:00">20.07.20, 21:45</time></span><div class='quote '>В данном случае никаких противоречий не вижу. Класс изначально проектировался для соблюдения состояний:<br>
<br>
1) Ожидает<br>
2) В состоянии соединения<br>
3) В состоянии ошибки<br>
4) В состоянии передачи<br>
<br>
Причем возможные переходы между состояниями заранее предопределены. В этом случае инвариантность не нарушается.</div></div><br>
Допустим. ИМХО, тогда лучше воспользоваться паттерном state и управление ресурсами в этом случае будет примерно такое, как я описал. Но дело твое. В методе load в случае успеха передать владение от локального объекта полю все равно никто не мешает. Если не понятно, то могу код привести чуть позже. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-21T00:31:18+00:00">21.07.20, 00:31</time></span></span><br>
<a class='tag-url' href='https://godbolt.org/z/zbhGr5' target='_blank'>https://godbolt.org/z/zbhGr5</a><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;memory&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">struct my_initializer {</div><div class="code_line">&nbsp;&nbsp; &nbsp;my_initializer()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;init&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;~my_initializer()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;deinit&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">struct my_struct {</div><div class="code_line">&nbsp;&nbsp; &nbsp;void load()</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;auto init = std::make_unique&#60;my_initializer&#62;();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// ...</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;bool success = true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// ...</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (success) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; init_.swap(init); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">private:</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::unique_ptr&#60;my_initializer&#62; init_;</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;my_struct a;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;enter&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;a.load();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cout &#60;&#60; &quot;exit&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Поигравшись с переменной success сможешь понять, в чем суть.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834766</guid>
        <pubDate>Tue, 21 Jul 2020 00:08:58 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834766</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834567'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T18:16:27+00:00">18.07.20, 18:16</time></span><div class='quote '>Быстренько налобал правильный тест.</div></div><br>
Скинь, плс, исходники потестить.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834763</guid>
        <pubDate>Mon, 20 Jul 2020 21:45:08 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834763</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834758'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T20:30:17+00:00">20.07.20, 20:30</time></span><div class='quote '>Если у тебя вызов сишной функции возвращает код возврата - кто тебе мешает кидать исключение в конструкторе RAII обертки? </div></div><br>
Не разобравшись - советуешь&#33;<br>
При чем тут вообще исключения? Вопрос в другом. В случае успешного прохождения полной цепочки инициализаций - ничего освобождать не нужно. После выхода из процедуры отдельные ресурсы должны оставаться валидными. Но, если не вся цепочка пройдена - вот тогда все ресурсы, захваченные до ошибки, должны быть освобождены.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834759'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T20:49:24+00:00">20.07.20, 20:49</time></span><div class='quote '>Плохая практика, не надо так делать. Прочитай про инварианты класса.</div></div><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Инвариа́нт — это свойство некоторого класса (множества) математических объектов, остающееся неизменным при преобразованиях определённого типа.</div></div><br>
В данном случае никаких противоречий не вижу. Класс изначально проектировался для соблюдения состояний:<br>
<br>
1) Ожидает<br>
2) В состоянии соединения<br>
3) В состоянии ошибки<br>
4) В состоянии передачи<br>
<br>
Причем возможные переходы между состояниями заранее предопределены. В этом случае инвариантность не нарушается. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-20T21:49:49+00:00">20.07.20, 21:49</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834762'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T21:41:37+00:00">20.07.20, 21:41</time></span><div class='quote '>Ну так это не RAII</div></div><br>
Получается - скоуп экзиты штоле тогда? :-?]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834762</guid>
        <pubDate>Mon, 20 Jul 2020 21:41:37 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834762</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834741'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T16:48:02+00:00">20.07.20, 16:48</time></span><div class='quote '>Типа, если действительно была ошибка - освобождать, а если нет - пропустить. И только в одной лямбде это не потребовалось.</div></div>Ну так это не RAII. В RAII нужно оборачивать ресурс, для которого известно время жизни, обозначив его {}, а не который когда захотел, получил, когда захотел, освободил. Если когда захотел, то это ж ничем не отличается от ручного управления. Посмотри в пример использования во <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834237' target='_blank'>втором &quot;костыле&quot;</a>, это пример из реальной программы... впрочем, мне не жалко скопипастить и даже прокомментировать:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;// Атомарно получить ресурс монопольного доступа к образу приложения и захватить его</div><div class="code_line">&nbsp;&nbsp;HANDLE sameApp = CreateMutex(NULL, TRUE, uniqName.c_str());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Вручную проверить успех получения ресурса</div><div class="code_line">&nbsp;&nbsp;if (sameApp == NULL)</div><div class="code_line">&nbsp;&nbsp; &nbsp;return static_cast&#60;void&#62;(logMsg(&quot;CreateMutex() failed&quot;, GetLastError()));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Зарегистрировать освобождение ресурса</div><div class="code_line">&nbsp;&nbsp;Guard sameAppGuarded([=]() { CloseHandle(sameApp); });</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Проверить, удалось ли захватить монополию или же доступ уже ранее (GetLastError() будет равен ERROR_ALREADY_EXISTS) был кем-то захвачен</div><div class="code_line">&nbsp;&nbsp;if (GetLastError() == ERROR_ALREADY_EXISTS)</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (WaitForSingleObject(sameApp, INFINITE) != WAIT_OBJECT_0) &nbsp; &nbsp; &nbsp; &nbsp;// подождать возможности монопольного доступа</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// При ошибке монополизации гвард сам освободит ресурс</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return static_cast&#60;void&#62;(logMsg(&quot;Recursive run detected for &quot; + name.filename().string(), GetLastError()));</div><div class="code_line">&nbsp;&nbsp;// Монополия успешно получена, зарегистрировать его отдачу другим страждущим</div><div class="code_line">&nbsp;&nbsp;Guard sameAppLocked([=]() { ReleaseMutex(sameApp); });</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Локальные границы времени жизни файлов, в которые перенаправляется консольный ввод/вывод</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;SECURITY_ATTRIBUTES attr = { sizeof(attr), NULL, TRUE };</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Файл для перенаправленного консольного ввода</div><div class="code_line">&nbsp;&nbsp; &nbsp;HANDLE hIn &nbsp;= CreateFile((newName.parent_path() / &quot;stdin.txt&quot;).string().c_str(),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FILE_GENERIC_READ, FILE_SHARE_DELETE,&amp;attr, CREATE_ALWAYS,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FILE_ATTRIBUTE_NORMAL, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Зарегистрировать его закрытие</div><div class="code_line">&nbsp;&nbsp; &nbsp;Guard hInGuarded ([=]() { CloseHandle(hIn); &nbsp;});</div><div class="code_line">/* и так для всех трёх стандартных консольных устройств,</div><div class="code_line">&nbsp;&nbsp; ну и кроме того там ещё куча логики работы с образом приложения */</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;// и тут эти локальные границы заканчиваются, файлы с консольным вводов/выводом закрываются гвардами.</div><div class="code_line">&nbsp;&nbsp;// Ниже есть ещё чуток кода для логгирования и ещё по мелочи, и гварды позаботятся и об освобождении образа приложения от монополии, и об освобождении ресурса</div></ol></div></div></div></div>В твоём случае тебе достаточно чётко определить времена жизни своих ресурсов и обозначить их {}, в частности вложенными функциями, если надо. И всё. Изнутри наружу хоть экспешном выходи.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834759</guid>
        <pubDate>Mon, 20 Jul 2020 20:49:24 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834759</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834753'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T18:47:41+00:00">20.07.20, 18:47</time></span><div class='quote '>Тогда нарушается логика поведения класса<br>
...<br>
Если логин не прошел - экземпляр класс болтается с состоянием ошибки</div></div><br>
Плохая практика, не надо так делать. Прочитай про инварианты класса.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834758</guid>
        <pubDate>Mon, 20 Jul 2020 20:30:17 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834758</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834741'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T16:48:02+00:00">20.07.20, 16:48</time></span><div class='quote '>Решил переписать &quot;по-фэншую&quot;, и как оказалось, выплыла шляпа ;) Когда без RAII - критикуют мол, забудешь освободить ресурс. А как оказалось, в моей проге, пришлось в каждую лямбду вставить проверку на ошибку. Типа, если действительно была ошибка - освобождать, а если нет - пропустить.</div></div><br>
Если бы переписал по феншую, скорее всего шляпы не было бы. Значит написал не по феншую  :-? Если у тебя вызов сишной функции возвращает код возврата - кто тебе мешает кидать исключение в конструкторе RAII обертки? Тогда и проверять не пришлось бы в деструкторе.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834753</guid>
        <pubDate>Mon, 20 Jul 2020 18:47:41 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834753</link>
        <description><![CDATA[JoeUser: Тогда нарушается логика поведения класса. В методе Login происходит полная инициализация подключение к серверу, ну и подключение. Если логин не прошел - экземпляр класс болтается с состоянием ошибки, по не будет удален (ну или еще попытки логина). В деструкторе вызывается Logoff, если нужно - вот он и рвет все соединения (опять же, если класс не в состоянии ошибки).]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834750</guid>
        <pubDate>Mon, 20 Jul 2020 18:27:40 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834750</link>
        <description><![CDATA[D_KEY: Ну вот в случае RAII у тебя и будет объект ssh_initializer или что-то вроде того. Который в деструкторе сделает ssh2_exit, если владеет объектом. Этот объект делаешь полем класса. Локально в функции, где идет init, ты создаешь временный объект этого класса и только в случае успеха передаешь владение полю.<br>Примерно так.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834749</guid>
        <pubDate>Mon, 20 Jul 2020 18:21:31 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834749</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834747'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T17:56:04+00:00">20.07.20, 17:56</time></span><div class='quote '>Остаться-то должна, но потом где-то же должен быть вызов libssh2_exit все равно.</div></div><br>
Это в деструкторе вызывается:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">sftp_class::~sftp_class() {</div><div class="code_line">&nbsp;&nbsp;if (sftpError != sftp_error::winsocket_error) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (sftpState == sftp_state::logged_in) Logoff(); // ◄────── вот тут и вызовется libssh2_exit</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;#ifdef WIN32</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;WSACleanup();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834747</guid>
        <pubDate>Mon, 20 Jul 2020 17:56:04 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834747</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T17:43:55+00:00">20.07.20, 17:43</time></span><div class='quote '>libssh2_exit() нужно вызывать только тогда, когда что-то потом пошло не так. Но если все отработало нормально - libssh2 должна остаться проинициализированной.</div></div><br>
Остаться-то должна, но потом где-то же должен быть вызов libssh2_exit все равно. Вот туда и надо передать владение. А не через guard&#39; ы.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834745</guid>
        <pubDate>Mon, 20 Jul 2020 17:43:55 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834745</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834743'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T17:31:00+00:00">20.07.20, 17:31</time></span><div class='quote '>Можешь код привести?</div></div><br>
Ну вот кусок:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// ...</div><div class="code_line">// инициализация библиотеки</div><div class="code_line">if (libssh2_init(0) != 0) {</div><div class="code_line">&nbsp;&nbsp;sftpError = sftp_error::init_error;</div><div class="code_line">&nbsp;&nbsp;return false;</div><div class="code_line">}</div><div class="code_line">Guard Guard_init([&amp;]() {</div><div class="code_line">&nbsp;&nbsp;if (sftpError != sftp_error::no) libssh2_exit();</div><div class="code_line">});</div><div class="code_line">// поиск адреса хоста</div><div class="code_line">// ...</div><div class="code_line">// ...</div><div class="code_line">// ...</div></ol></div></div></div></div><br>
libssh2_exit() нужно вызывать только тогда, когда что-то потом пошло не так. Но если все отработало нормально - libssh2 должна остаться проинициализированной.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834743</guid>
        <pubDate>Mon, 20 Jul 2020 17:31:00 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834743</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834741'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-20T16:48:02+00:00">20.07.20, 16:48</time></span><div class='quote '>А как оказалось, в моей проге, пришлось в каждую лямбду вставить проверку на ошибку. Типа, если действительно была ошибка - освобождать, а если нет - пропустить. И только в одной лямбде это не потребовалось. Поэму рисуется контр-аргумент: не поставишь проверку необходимости освобождения - получишь ошибку времени исполнения.</div></div><br>
Возможно, ты что-то не так делаешь, например, не передаешь владение ресурсом. И о каких лямбдах речь?<br>
<br>
Можешь код привести?]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834741</guid>
        <pubDate>Mon, 20 Jul 2020 16:48:02 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834741</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Qraizer</strong>, а вот тут<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// ...</div><div class="code_line">Guard sameAppGuarded([=]() { CloseHandle(sameApp); });</div><div class="code_line">// ...</div></ol></div></div></div></div><br>
Может в лямбде лучше по ссылке захватывать? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-20T17:15:08+00:00">20.07.20, 17:15</time></span></span><br>
Дааа ... у этого RAII тоже есть побочки. Решил переписать &quot;по-фэншую&quot;, и как оказалось, выплыла шляпа ;) Когда без RAII - критикуют мол, забудешь освободить ресурс. А как оказалось, в моей проге, пришлось в каждую лямбду вставить проверку на ошибку. Типа, если действительно была ошибка - освобождать, а если нет - пропустить. И только в одной лямбде это не потребовалось. Поэму рисуется контр-аргумент: не поставишь проверку необходимости освобождения - получишь ошибку времени исполнения. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-20T17:16:09+00:00">20.07.20, 17:16</time></span></span><br>
ЗЫ: <strong class='tag-b'>Qraizer</strong>, мне понравились твои гварды&#33; Аккуратнее всего получается. :good:]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834701</guid>
        <pubDate>Sun, 19 Jul 2020 22:19:26 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834701</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834691'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T17:24:26+00:00">19.07.20, 17:24</time></span><div class='quote '>Но таки - аcилил?&#33; )))</div></div>Кому вдруг критично :-? , пусть юзают. Я так не считаю. И даже не думаю, что кому надо было бы, не написал бы сам молча, а запросил саппорт &quot;памагите&quot;.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834691'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T17:24:26+00:00">19.07.20, 17:24</time></span><div class='quote '>наверное можно было бы и всю лямбду в макро загнать?</div></div>М-м, нет. В общем случае лямбда может быть очень сложной, препроцессор поломается на разделителях. Да и зачем? Препроцессор штука, конечно, мощная, но ну её.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834691</guid>
        <pubDate>Sun, 19 Jul 2020 17:24:26 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834691</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Qraizer</strong>, как уж на сковородке&#33; :lool: Но таки - аcилил?&#33; ))) <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-19T17:26:36+00:00">19.07.20, 17:26</time></span></span><br>
<strong class='tag-b'>Qraizer</strong>, наверное можно было бы и всю лямбду в макро загнать?]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834686</guid>
        <pubDate>Sun, 19 Jul 2020 16:58:05 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834686</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834602'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T08:32:29+00:00">19.07.20, 08:32</time></span><div class='quote '>Посмотри на свою иммитацию scope: scope1, scope2, scope3... - что это за мерзкие нумерованные переменные, которые нигде не задействованы? Вот где костыль-то.</div></div>Угу. А если:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#define CAT(X, Y) X##Y</div><div class="code_line">#define VAR(X, Y) CAT(X, Y)</div><div class="code_line">#define SCOPE ScopeD::scope VAR(dummy, __LINE__)</div></ol></div></div></div></div>то лучше? Ненуачё...<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;using namespace ScopeD;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SCOPE (failure, [](){ std::cout &#60;&#60; &quot;scope(exit) 1&quot; &#60;&#60; std::endl; });</div><div class="code_line">&nbsp;&nbsp;throw std::runtime_error(&quot;exception&quot;);</div><div class="code_line">&nbsp;&nbsp;SCOPE (failure, [](){ std::cout &#60;&#60; &quot;scope(exit) 2&quot; &#60;&#60; std::endl; });</div><div class="code_line">}</div></ol></div></div></div></div><br>
 :unsure:]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834683</guid>
        <pubDate>Sun, 19 Jul 2020 16:35:54 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834683</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834679'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T16:20:57+00:00">19.07.20, 16:20</time></span><div class='quote '>Объективно – пару лет</div></div><br>
Враки&#33;  :lol:  Я с лямбдами в Perl&#39;е работал с 1998 года (и то - я опаздун в освоении Перла). В сях - &quot;не прошло и пол-года&quot;.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834679</guid>
        <pubDate>Sun, 19 Jul 2020 16:20:57 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834679</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834602'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T08:32:29+00:00">19.07.20, 08:32</time></span><div class='quote '>Ага, &quot;костыль&quot;, который выглядит чище, а работает не хуже.</div></div>Именно что выглядит. Так-то он хуже. Потому что не избавляет пользователей scope()-ов от того, чтобы быть постоянно быть во внимании и заниматься рутинным делом: проверять успех небезотказной операции и клепать код отмены транзакций. RAII требует этого только от автора.<br>
Ну и опять же, если пользователей не больше авторов :D , тогда scope()-ы окупаются. Но в промышленных решениях это редкие события. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-19T16:28:38+00:00">19.07.20, 16:28</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834602'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T08:32:29+00:00">19.07.20, 08:32</time></span><div class='quote '>Сколько ждали появления в плюсах лямбд и auto?</div></div>Объективно – пару лет. В бусте подобные штуки появились быстро, и в следующий Стандарт заехали без проблем.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834642</guid>
        <pubDate>Sun, 19 Jul 2020 14:15:38 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834642</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834637'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T13:38:11+00:00">19.07.20, 13:38</time></span><div class='quote '>Такие ошибки и делают только студенты по своему незнанию.</div></div><br>
Ну да, а остальные не делают никаких ошибок.  :good:  Я уже где то такое слышал.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834637'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T13:38:11+00:00">19.07.20, 13:38</time></span><div class='quote '>Ну так scope(...) и надо применять только в таких случаях. Я же говорил много раз.</div></div><br>
Ну вообще мы объясняли человеку почему лучше в его случае избавится от goto, и обернуть ресурс в RAII обертку, приводили разные примеры, пришол ты и сказал - как хорошо что в D такого говна нет, а есть scope(exit). А теперь ты говоришь - что не говорил что он весь такой из себя ахереть какой.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834637'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T13:38:11+00:00">19.07.20, 13:38</time></span><div class='quote '>Я хз как такое можно забыть. Ты же вот прямо только что выделил память, и если ты не страдаешь склерозом, в голове автоматом возникает мысль: &quot;надо освободить ресурс&quot;, и ты тут же пишешь scope(exit). С таким же успехом ты можешь забыть написать кастомный делетер в unique_ptr. Вот если у тебя такое встречается много раз, то уже становится неудобно, но в таких случаях и unique_ptr с кастомным делетером становится неудобным.</div></div><br>
Когда работаешь с сырым указателем - очень часто забываешь написать delete. Тут примерно тоже самое - потому что это отдельная конструкция. С кастомным делитером - сразу видно будет что ресурс не освобождается, просто по самой конструкции. А этот scope(exit) - не обязательно можно написать сразу после выделения, его можно написать и в конце и в середине кода, уже после выделения памяти под ресурс. А раз так написать можно - значит будь уверен кто нибудь непременно так и напишет. Весь вопрос - как долго будут потом багу искать. Может быть сразу найдут, а может кто то неделю в отладчике проведет. Я вот именно это имею ввиду. Да ты можешь написать - вызывай сразу после выделения памяти под ресурс, но от этого возможность написать его где угодно никуда не девается.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834637'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T13:38:11+00:00">19.07.20, 13:38</time></span><div class='quote '>Конечно корректно, ведь конструирование происходит до scope(exit), соотвественно, если при конструировании произошло исключение, то scope(exit) не отработает. Разве это не очевидно?</div></div><br>
Ну например там:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Установили соединение<br>
Открыли базу<br>
Начали получать доступ к таблице - исключение<br>
<br>
scope(exit){<br>
 Очистили ресурсы от таблицы<br>
 Закрыли Базу<br>
 Закрыли соединение<br>
}</div></div><br>
В итоге соединение и БД остались открытыми.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834637'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T13:38:11+00:00">19.07.20, 13:38</time></span><div class='quote '>Он положился на scope и scope сделал ровно то, что он и ожидал, не больше не меньше. Его &quot;обманул&quot; GC, а не scope.</div></div><br>
Мы не знаем кто там кого обманул, вполне возможно что он написал все верно, а потом пришел вася, и вместо создания объекта на стеке как было, взял переделал создание объекта на куче.<br>
Еще раз повторяю - там синтетический пример, обычно такие пишут, чтоб не захламлять лишними деталями и не сбивать людей с толку. Вот допустим у меня проект, хренова туча классов/кода летит какая то ошибка, я не буду все это выкладывать на форум, чтоб спросить что не так. Я возьму напишу минимальный, синтетический пример для воспроизведения проблемы, и выкачу его на форум, там будет 2 класса и три строчки с выводом в консоль, а в реале, может быть сотни классов и строк кода.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834637'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T13:38:11+00:00">19.07.20, 13:38</time></span><div class='quote '>Неверно. scope(exit) и GC - вещи ортогональные. В моем же примере с PQClean, GC вообще никак не используется. И повторю еще раз: scope(...) может работать не только с ресурсами (в частности не только с памятью). И также повторю, что все парадигмы C++, в том числе и RAII работают и в D. Ну и какой это сахар, если для его реализации в плюсах надо маленькую либку написать, что и сделал Qraizer.</div></div><br>
Ну да, scope ортогонален GC примерно на столько же, на сколько и finally. Для его реализации достаточно написать unique_ptr, можно и класс написать. <strong class='tag-b'>Qraizer</strong> тебе писал аналог в D, чтоб оно и выглядело и юзалось прям как один в один, максимально приближенно. Т.е. по сути он тебе этот сахар и реализовал на плюсах. А так это ничем не отличается от любого класса, в деструкторе которого выполняется то, что у тебя выполняется в теле scope. Потому как оно ровно так же - гарантированно выполняется в конце блока, устойчиво к исключениям, по сути как и finally. Так что scope(exit) - в плюсах это синтаксический сахар, не более. Были бы лямбды в плюсах более лаконичными, хотя бы похожи на делегаты в шарпах, то можно было бы переписать код с std::unique_ptr с кастомным делитером примерно вот так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">auto resource = std::unique_ptr(new CResource(), (e) =&#62; {</div><div class="code_line">&nbsp;&nbsp;//! free resource.</div><div class="code_line">&nbsp;&nbsp;delete e;</div><div class="code_line">});</div></ol></div></div></div></div><br>
По сути в плюсах все к этому и сводится, если убрать весь этот синтаксический шлак по уточнению типов и указанию шаблонных параметров всяких.<br>
Но на сколько я понимаю в плюсах такое написать нельзя из за скудного RTTI, поэтому и приходится чуть больше закорючек писать.<br>
<br>
Ну и по описанию: <a class='tag-url' href='https://tour.dlang.org/tour/en/gems/scope-guards' target='_blank'>https://tour.dlang.org/tour/en/gems/scope-guards</a><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;// scope guards allow placing allocations</div><div class="code_line">&nbsp;&nbsp; &nbsp;// and their clean up code next to each</div><div class="code_line">&nbsp;&nbsp; &nbsp;// other</div><div class="code_line">&nbsp;&nbsp; &nbsp;import core.stdc.stdlib : free, malloc;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int* p = cast(int*) malloc(int.sizeof);</div><div class="code_line">&nbsp;&nbsp; &nbsp;scope(exit) free(p);</div></ol></div></div></div></div><br>
Приводят ровно такой пример, который в С++ переписывается обычным unique_ptr, в примере free вызывается в scope(exit), в плюсах будет вызываться в кастомном делитере.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834637'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T13:38:11+00:00">19.07.20, 13:38</time></span><div class='quote '>Разрабы тащат в языки все что им в голову взбредет, сам факт что разрабы что-то притащили или не притащили вообще не критерий. Тащат говно и наоборот хорошее не тащат сплошь и рядом. </div></div><br>
Ну в такие ЯП как JAVА/C# по моему тащат вообще все подряд, что можно затащить.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834637</guid>
        <pubDate>Sun, 19 Jul 2020 13:38:11 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834637</link>
        <description><![CDATA[applegame: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>Если бы все было просто как ты пишешь, баги делали бы только студенты по своему не знанию.</div></div>Такие ошибки и делают только студенты по своему незнанию.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>Ок, вот ты привел там функцию - с виду имитирующуюю RAII, в принципе такой вариант еще ладно, если знаешь что у тебя тут голый ресурс, и ты тут его же удаляешь - такое еще можно оправдать.</div></div>Ну так scope(...) и надо применять только в таких случаях. Я же говорил много раз.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>Но ведь разные есть случаи, я понял бы если бы это была единная конструкция, хотя бы там через точку например. Но понимаешь ли, бывает так что пишешь new int, и тут же забываешь сделать delete, потому что это две конструкции, независимы друг от друга семантически. Так и тут.</div></div>Я хз как такое можно забыть. Ты же вот прямо только что выделил память, и если ты не страдаешь склерозом, в голове автоматом возникает мысль: &quot;надо освободить ресурс&quot;, и ты тут же пишешь scope(exit). С таким же успехом ты можешь забыть написать кастомный делетер в unique_ptr. Вот если у тебя такое встречается много раз, то уже становится неудобно, но в таких случаях и unique_ptr с кастомным делетером становится неудобным.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>Тут как бы и коню понятно что до второго scope оно не дойдет. Корректно ли отработает первый scope, если исключение произошло на этапе конструирования сложного объекта, вот в чем вопрос.</div></div>Конечно корректно, ведь конструирование происходит до scope(exit), соотвественно, если при конструировании произошло исключение, то scope(exit) не отработает. Разве это не очевидно?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>Имелось ввиду, что ты можешь положится на scope, ну раз оно от RAII вообще никак не отличается по твоим словам, а гдето выше другой чувак понадеется на полноценный деструктор, и это приведет к ошибке, как в примере по ссылке.</div></div>Он положился на scope и scope сделал ровно то, что он и ожидал, не больше не меньше. Его &quot;обманул&quot; GC, а не scope.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>Я его притащил - показать с какими проблемами можно столкнуться, полностью положившись на него.</div></div>Наоборот, он столкнулся с проблемой, потому что не полностью положился на scope, а понадеялся на деструктор. Если бы он полностью положился на scope и написал бы в нем TTF_CloseFont() и TTF_Quit(), то все бы работало без сегфолтов.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>В С++ нет scope, потому что там нет GC, а в D есть GC, поэтому там и scope актуален. Для С++ этот scope(exit) - не более, чем синтаксический сахар.</div></div>Неверно. scope(exit) и GC - вещи ортогональные. В моем же примере с PQClean, GC вообще никак не используется. И повторю еще раз: <strong class='tag-b'>scope(...) может работать не только с ресурсами (в частности не только с памятью)</strong>. И также повторю, что все RAII-парадигмы C++ работают и в D. Ну и какой это сахар, если для его реализации в плюсах надо маленькую либку написать, что и сделал Qraizer.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>но например тотже try-with-resources/using</div></div>Это сущности чуть более высокого уровня, чем scope(exit), но их можно реализовать при помощи scope(exit).<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834633'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T12:31:46+00:00">19.07.20, 12:31</time></span><div class='quote '>Да и в такие языки любят тащить все попало, но scope(exit) - я там как то не встречал. Видимо даже там разрабы посчитали - что излишне вводить то, что уже есть в языке.</div></div>Разрабы тащат в языки все что им в голову взбредет, сам факт что разрабы что-то притащили или не притащили вообще не критерий. Тащат говно и наоборот хорошее не тащат сплошь и рядом.]]></description>
        <author>applegame</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834633</guid>
        <pubDate>Sun, 19 Jul 2020 12:31:46 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834633</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834598'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T06:15:16+00:00">19.07.20, 06:15</time></span><div class='quote '>Если бы он все верно оценил, он бы так не написал. Очевидно, что он думал, что деструкторы объектов на куче вызываются по тем же правилам, что и деструкторы объектов на стеке.</div></div><br>
Это тебе очевидно и синтетического примера в 5 строчек. Если бы все было просто как ты пишешь, баги делали бы только студенты по своему не знанию. На практике у него может быть довольно не примитивный код, чтоб верно оценить все ньюансы. Именно по этому писать руками дополнительную строчку - может являтся источником ошибок. <br>
Ок, вот ты привел там функцию - с виду имитирующуюю RAII, в принципе такой вариант еще ладно, если знаешь что у тебя тут голый ресурс, и ты тут его же удаляешь - такое еще можно оправдать. Но ведь разные есть случаи, я понял бы если бы это была единная конструкция, хотя бы там через точку например. Но понимаешь ли, бывает так что пишешь new int, и тут же забываешь сделать delete, потому что это две конструкции, независимы друг от друга семантически. Так и тут.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834598'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T06:15:16+00:00">19.07.20, 06:15</time></span><div class='quote '>Ну так они и пишут, в деструкторах оберток и кастомных делетерах unique_ptr.</div></div><br>
Это пишется в одной конструкции. Если было бы все так просто - все эти RAII нахер бы никому не упали. Какая проблема вызвать delete, после выделения ресурсов - да абсолютно никакой. И тем не менее в том же С++ утечек куча, из за того что люди полагаются на свои руки и память, а потом выхватывают утечки.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834598'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T06:15:16+00:00">19.07.20, 06:15</time></span><div class='quote '>Нет в сяшке не тот же. Вызовуться только те scope(), которые успели отработать. Поведение scope(exit) в плане очистки ресурсов полностью совпадает с unique_ptr с кастомным деструктором. Похоже, ты не совсем понял оно работает. Вот посмотри очень короткий пример: <a class='tag-url' href='https://run.dlang.io/is/7jJE7b' target='_blank'>https://run.dlang.io/is/7jJE7b</a></div></div><br>
Тут как бы и коню понятно что до второго scope оно не дойдет. Корректно ли отработает первый scope, если исключение произошло на этапе конструирования сложного объекта, вот в чем вопрос.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834598'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T06:15:16+00:00">19.07.20, 06:15</time></span><div class='quote '>Я это понял так, что ты решил, что scope(exit) как-то влияет на это.</div></div><br>
Имелось ввиду, что ты можешь положится на scope, ну раз оно от RAII вообще никак не отличается по твоим словам, а гдето выше другой чувак понадеется на полноценный деструктор, и это приведет к ошибке, как в примере по ссылке. <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834598'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T06:15:16+00:00">19.07.20, 06:15</time></span><div class='quote '>Ну я не тащил сюда всякие странные багнутые куски кода. А так да, в C++ нет scope, но есть RAII, а в D есть и scope и RAII. </div></div><br>
Я его притащил - показать с какими проблемами можно столкнуться, полностью положившись на него. В С++ нет scope, потому что там нет GC, а в D есть GC, поэтому там и scope актуален. Для С++ этот scope(exit) - не более, чем синтаксический сахар.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834598'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T06:15:16+00:00">19.07.20, 06:15</time></span><div class='quote '>Я не сразу понял. Когда я писал try/catch/finally я имел в виду совокупность всех возможных комбинаций и так же понял и твое try/catch/finally.<br>
Важно понимать, что scope(success)/scope(failure)/scope(exit) похожи на try/catch/finally, но отличия достаточно большие. </div></div><br>
По сути все отличия сводятся к удобству использования. Не надо просто писать все эти try/catch/finally, но например тотже try-with-resources/using - уже куда более удобны этих конструкций try/catch/finally, и вполне себе могут даже потягаться со scope(exit).<br>
Да и в такие языки любят тащить все попало, но scope(exit) - я там как то не встречал. Видимо даже там разрабы посчитали - что излишне вводить то, что уже есть в языке.]]></description>
        <author>Wound</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834619</guid>
        <pubDate>Sun, 19 Jul 2020 11:36:46 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834619</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T10:02:48+00:00">19.07.20, 10:02</time></span><div class='quote '>Там, кстати, не собираются делать аналог try-with-resources?</div></div><br>
Нет, и не думаю, что станут: try-with-resources работает только в рамках вызова процедуры и одного потока (одной горутины) — слишком узкоспециализированный механизм. Кроме того, try-with-resources в Java работает только если класс реализует<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">interface AutoCloseable {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void close() throws Exception</div><div class="code_line">}</div></ol></div></div></div></div><br>
а разные «ресурсы» могут иметь разные методы «захвата/освобождения» в соответствии с их семантикой: Open/Close, Lock/Unlock, Create/Delete и т.п. Либо заставлять всех использовать всегда один метод (Close, там или Release) — как-то тупо. Вводить в язык явное понятие ресурса с каким-нибудь спец-синтаксисом, типа помечать освобождающий метод каким-нибудь ключевым словом или спец-символом — ну хз. И это всё равно никак не поможет с разделяемыми ресурсами, <a class='tag-url' href='https://play.golang.org/p/13F9t8wUXZ4' target='_blank'>например</a>:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">package main</div><div class="code_line">&nbsp;</div><div class="code_line">import (</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;fmt&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;sync&quot;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&quot;time&quot;</div><div class="code_line">)</div><div class="code_line">&nbsp;</div><div class="code_line">const nWorkers = 5</div><div class="code_line">&nbsp;</div><div class="code_line">func main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;fmt.Println(&quot;ok1:&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ok1()</div><div class="code_line">&nbsp;&nbsp; &nbsp;fmt.Println(&quot;\nok2:&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;ok2()</div><div class="code_line">&nbsp;&nbsp; &nbsp;fmt.Println(&quot;\nnot ok:&quot;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;notOk()</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">func ok1() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var wg sync.WaitGroup</div><div class="code_line">&nbsp;&nbsp; &nbsp;wg.Add(nWorkers) // acquire</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 0; i &#60; nWorkers; i++ {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;go func(x int) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;defer wg.Done() // release</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;doSomeWork(x)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}(i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;wg.Wait()</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">func ok2() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var wg sync.WaitGroup</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 0; i &#60; nWorkers; i++ {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;wg.Add(1) // acquire</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;go func(x int) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;defer wg.Done() // release</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;doSomeWork(x)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}(i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;wg.Wait()</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">func notOk() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;var wg sync.WaitGroup</div><div class="code_line">&nbsp;&nbsp; &nbsp;for i := 0; i &#60; nWorkers; i++ {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;go func(x int) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;wg.Add(1) // acquire</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;defer wg.Done() // release</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;doSomeWork(x)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}(i)</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;wg.Wait()</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">func doSomeWork(x int) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#60;-time.After(1 * time.Second)</div><div class="code_line">&nbsp;&nbsp; &nbsp;fmt.Println(&quot;done #&quot;, x)</div><div class="code_line">}</div></ol></div></div></div></div><br>
=&gt;<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">ok1:</div><div class="code_line">done # 2</div><div class="code_line">done # 0</div><div class="code_line">done # 4</div><div class="code_line">done # 3</div><div class="code_line">done # 1</div><div class="code_line">&nbsp;</div><div class="code_line">ok2:</div><div class="code_line">done # 0</div><div class="code_line">done # 2</div><div class="code_line">done # 1</div><div class="code_line">done # 3</div><div class="code_line">done # 4</div><div class="code_line">&nbsp;</div><div class="code_line">not ok:</div><div class="code_line">&nbsp;</div><div class="code_line">Program exited.</div></ol></div></div></div></div><br>
<br>
try-with-resources тут никак не поможет, т.к. позволяет описать только вариант notOk.<br>
<br>
А в JDK, ЕМНИП, у HttpURLConnection освобождающий метод называется disconnect, а не close и соответствено класс не реализует AutoCloseable и использовать его в try-with-resources нельзя :facepalm:<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T10:02:48+00:00">19.07.20, 10:02</time></span><div class='quote '>А with*-функции используют?</div></div><br>
Ну, некоторые используют, но callback-style не всем нравится.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834617</guid>
        <pubDate>Sun, 19 Jul 2020 11:24:45 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834617</link>
        <description><![CDATA[applegame: Расслабтесь:<br>
<span class="b-attach" data-size="126495" data-hits="208" data-attach-id="62405" data-attach-post-id="3834617">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3834617&amp;attach_id=62405' title='Скачать файл' target='_blank'>io_thief.jpg</a> (, : 208)
		</span>]]></description>
        <author>applegame</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834616</guid>
        <pubDate>Sun, 19 Jul 2020 11:07:10 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834616</link>
        <description><![CDATA[applegame: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T10:02:48+00:00">19.07.20, 10:02</time></span><div class='quote '>Это было не очевидно из твоего кода. Если так, то спорить тут не о чем.</div></div>Я словами это говорил:<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834361'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-17T08:48:13+00:00">17.07.20, 08:48</time></span><div class='quote '>Это освобождение в моей обертке фигурировало буквально <strong class='tag-b'>внутри одной функции.</strong></div></div>И потом еще неоднократно повторял. Но ты походу писатель а не читатель :) Впрочем, я тебя понимаю, кому охота читать портянки бессодержательных споров с Килей. :lol: <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T10:02:48+00:00">19.07.20, 10:02</time></span><div class='quote '>Если мы это сделаем, то это будет уже другой подход. Понимаешь? </div></div>Конечно. Но ты же сам придумал это сравнение? Изначально-то речь шла о ситуации, когда у тебя выбор <strong class='tag-b'>самому</strong> писать <strong class='tag-b'>одноразовую</strong> RAII-обертку или воспользоваться одноразовым же scope(exit). А тут ты приводишь пример готовой RAII-обертки из стандартной либы да и еще подразумевая многократное ее применение.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T10:02:48+00:00">19.07.20, 10:02</time></span><div class='quote '>Зато есть странно выглядищий для людей не знакомым с паттерном вызов функции с передачей лямбды, хотя логично делать эти действия на том же уровне, поскольку контекст тот же и мы не специфицируем никакое поведение.</div></div>Лямбда подхватывает текущий контекст. Кроме того лямбда вообще может выглядеть просто как скоуп, который лочится. Например в D:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">mutex.locked({</div><div class="code_line">&nbsp;&nbsp; ...</div><div class="code_line">});</div></ol></div></div></div></div>Лично мне это видится более естественным, чем объявление переменной-гварда. Вызов функции любому программисту понятен: внутри что-то делается, по названию функции можно понять что именно делается. А в случае с объявлением переменной-гварда, нужно <em class='tag-i'>знать</em>, что это RAII-объект. Потому что переменная объявлена и ничего с ней больше не происходит. Неплюсовик ожидает, что если переменную объявили, то значит ее собираются использовать, если же ее не используют, то это скорее всего ошибка (даже ворнинг такой есть unused variable). То бишь, в данном случае объявление переменной используют <strong class='tag-b'>не по общепринятому назначению</strong>. Вот это я и называю костылем.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T10:02:48+00:00">19.07.20, 10:02</time></span><div class='quote '>Я тебя уже просил привести свое определение термина &quot;костыль&quot;.</div></div>Нет, сначала ты приведи свое определение термина &quot;определение термина&quot;. :)<br>
Все субъективно, я привел свое мнение. А так вон фанаты сяшки или, прости господи, Zig будут называть любой твой RAII - вселенским злом и страшным костылем. И аргументы у них найдутся из серии: в этом вашем RAII-объекте непонятно что происходит, а в моей милой функции все явно написано. И хрен ты их переубедишь :)<br>
Я высказал свое мнение и написал, что именно считаю костылем. Тебе это не показалось костылем - ну и флаг тебе в руки, что еще ты от меня хочешь? :D<br>
Мы же тут просто мнениями обмениваемся и не ставим цели учить писать программы. <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T10:02:48+00:00">19.07.20, 10:02</time></span><div class='quote '>Если ты используешь scope(exit) просто в реализации bracket pattern, то для работы с ресурсом ты используешь bracket pattern, а не scope(exit), понимаешь? scope(exit) у тебя просто часть реализации, там вооще мог быть try...catch, это не имеет принципиального значения <br>
Впрочем, я писал уже, что scope(exit) лучше finally, хотя и не принципиально.</div></div>Да-да, так и есть. И scope(exit) очень удобно применять для реализации этого, хм паттерна, в языках, в которых существют исключения и ранний return.<br>
До этого обсуждения ни разу не слышал, что это паттерн и что у него, оказывается, даже есть название. Хотя это похоже какой-то чисто хаскелевский мемасик.]]></description>
        <author>applegame</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834610</guid>
        <pubDate>Sun, 19 Jul 2020 10:02:48 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834610</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834599'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T07:11:34+00:00">19.07.20, 07:11</time></span><div class='quote '>Этот PQClear встречается <strong class='tag-b'>во всей</strong> моей обертке вокруг libpq <strong class='tag-b'>ровно один раз</strong>, а именно в scope(exit) в одном из методов класса Connection.</div></div><br>
Это было не очевидно из твоего кода. Если так, то спорить тут не о чем.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Тогда двай уж и scope(exit) вынесем в отдельную функцию</div></div><br>
Если мы это сделаем, то это будет уже другой подход. Понимаешь? :) <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>И знаешь чем второе лучше первого?</div></div><br>
Я достаточно подробно описал твое &quot;второе&quot; в предыдущем ответе тебе. И даже сказал, что не вижу в этом подходе ничего плохого, просто RAII более универсальный подход.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Нет бесполезного и странно выглядящего для людей не знающих C++ объявления переменной lock, которая нигде потом явно не используется.</div></div><br>
Зато есть странно выглядищий для людей не знакомым с паттерном вызов функции с передачей лямбды, хотя логично делать эти действия на том же уровне, поскольку контекст тот же и мы не специфицируем никакое поведение.<br>
<br>
Зависит от того, к чему привык конкретный программист, который будет читать код. Вкусовщина.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Самый что ни на есть настоящий костыль.</div></div><br>
Я тебя уже просил привести свое определение термина &quot;костыль&quot;. Никакой принципиальной разницы тут нет, поскольку и в случая RAII и в случае bracket pattern ты освободишь ресурс автоматически. В первом случае за счет &quot;лишнего&quot; объекта, во втором - за счет &quot;лишних&quot; вызова функции и лямбды.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>заверни scope(...) в отдельную функцию (получится тот же using/with/try-with-resources, только лучше, потому что гибче) или делай RAII.</div></div><br>
Если ты используешь scope(exit) просто в <em class='tag-i'>реализации</em> bracket pattern, то для работы с ресурсом ты используешь bracket pattern, а не scope(exit), понимаешь? scope(exit) у тебя просто часть реализации, там вооще мог быть try...catch, это не имеет принципиального значения ;) <br>
Впрочем, я писал уже, что scope(exit) лучше finally, хотя и не принципиально.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834556'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T16:01:38+00:00">18.07.20, 16:01</time></span><div class='quote '>Но RAII выигрывает и у них. Хотя бы тем, что может быть точно так же использован для полей структуры/класса.</div></div>Это как сказать, что вездеход лучше автомобиля, потому что вездеход может быть точно также использован для езды по болотам. :lol:</div></div><br>
У автомобиля есть преимущества перед вездеходом, у bracket pattern перед RAII можешь такие указать? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-19T10:06:19+00:00">19.07.20, 10:06</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834600'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T07:47:06+00:00">19.07.20, 07:47</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834599'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T07:11:34+00:00">19.07.20, 07:11</time></span><div class='quote '>Не знаю что за defer (Go?)</div></div><br>
Да<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">f, err := os.Open(&quot;some/file&quot;)</div><div class="code_line">if err != nil { return err }</div><div class="code_line">defer f.Close()</div></ol></div></div></div></div></div></div><br>
Там, кстати, не собираются делать аналог try-with-resources? А with*-функции используют?]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834605</guid>
        <pubDate>Sun, 19 Jul 2020 09:34:53 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834605</link>
        <description><![CDATA[applegame: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834604'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T08:59:32+00:00">19.07.20, 08:59</time></span><div class='quote '>Так это приукрашенный C, откуда там лямбды? =)</div></div>Они там <a class='tag-url' href='https://github.com/ziglang/zig/issues/130' target='_blank'>полиморфизьм обсуждают</a> :) Почему бы и лямбды не сделать? Они вроде не противоречит их девизам.]]></description>
        <author>applegame</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834604</guid>
        <pubDate>Sun, 19 Jul 2020 08:59:32 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834604</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834602'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T08:32:29+00:00">19.07.20, 08:32</time></span><div class='quote '>ЕНМНИП, у них до сих пор нет лямбд.</div></div><br>
Так это приукрашенный C, откуда там лямбды? =)]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834602</guid>
        <pubDate>Sun, 19 Jul 2020 08:32:29 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834602</link>
        <description><![CDATA[applegame: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T17:48:10+00:00">18.07.20, 17:48</time></span><div class='quote '>И чем это будет отличаться от классического RAII? Ты ещё не забыл о главном преимуществе scope()ов, за которое радеешь?</div></div>Тем, что написать такую обертку проще, чем RAII-класс. Ну и в случаях вроде лока мютексов еще и нет бесполезных  объявлений переменных. Посмотри на свою иммитацию scope: scope1, scope2, scope3... - что это за мерзкие нумерованные переменные, которые нигде не задействованы? Вот где костыль-то.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T17:48:10+00:00">18.07.20, 17:48</time></span><div class='quote '>Вот. Собственно это и есть тот критерий, который оправдано можно закостылить scope()ом...</div></div>Ага, &quot;костыль&quot;, который выглядит чище, а работает не хуже. :D Костыль - это стрельба из пушки по воробьям.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T17:48:10+00:00">18.07.20, 17:48</time></span><div class='quote '>но вдруг и внезапно – скоуп может захотеть владеть разными ресурсами, в разном количестве и с разной стратегией владения.</div></div>Если скоуп внезапно захочет чего-то сложного, то внезапно убирается scope(...) и делается та самая RAII-обертка. Но на моей практике такого никогда не было. Если я принял решение использовать scope(...), то в будущем так и не возникала необходимость его менять на RAII.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T17:48:10+00:00">18.07.20, 17:48</time></span><div class='quote '>Может быть иногда и не удобно, но всегда надёжно.</div></div>Это называется оверинжиниринг, когда код усложняется &quot;на всякий случай&quot;, даже когда вероятность возниконовения этого &quot;всякого случая&quot; в будущем близка к нулю. Я сам страдаю таким и раньше мне приходилось местами заставлять себя писать scope(exit) вместо RAII-обертки. Потому что объективная оценка показывала, что в данном случае &quot;вдруг и внезапно скоуп никогда не захочет владеть разными ресурсами, в разном количестве и с разной стратегией владения.&quot; Сейчас уже почти привык не городить абстракции и обобщения там, где они вероятно не понадобятся никогда.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834566'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T17:48:10+00:00">18.07.20, 17:48</time></span><div class='quote '>Исполнение данных тобой инструкций – да, автоматическое. С этим и __attribute__((__cleanup__())) справляется. Интересно, почему его не включали в Стандарт C? Это же так удобно, по твоим словам.</div></div>А по твоему удобнее эти goto? Да и cleanup гораздо примитивнее scope(exit).<br>
А так сишники народ странный, но думаю многим из них понравился бы scope(exit). А Стандарт это дело консервативное и тормозное. Сколько ждали появления в плюсах лямбд и auto? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-19T08:37:01+00:00">19.07.20, 08:37</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834600'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T07:47:06+00:00">19.07.20, 07:47</time></span><div class='quote '>и ещё Zig, например</div></div>Да, вспомнил. Я пытался юзать Zig, но как-то не зашло. Слишком уж странные у них лозунги. ЕНМНИП, у них до сих пор нет лямбд.]]></description>
        <author>applegame</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834600</guid>
        <pubDate>Sun, 19 Jul 2020 07:47:06 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834600</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834599'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-19T07:11:34+00:00">19.07.20, 07:11</time></span><div class='quote '>Не знаю что за defer (Go?)</div></div><br>
Да<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">f, err := os.Open(&quot;some/file&quot;)</div><div class="code_line">if err != nil { return err }</div><div class="code_line">defer f.Close()</div></ol></div></div></div></div><br>
<br>
и ещё <a class='tag-url' href='https://ziglang.org/#A-fresh-take-on-error-handling' target='_blank'>Zig</a>, например<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">const std = @import(&quot;std&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">pub fn main() !void {</div><div class="code_line">&nbsp;&nbsp; &nbsp;const file = try std.fs.cwd().openFile(&quot;does_not_exist/foo.txt&quot;, .{});</div><div class="code_line">&nbsp;&nbsp; &nbsp;defer file.close();</div><div class="code_line">&nbsp;&nbsp; &nbsp;try file.writeAll(&quot;all your codebase are belong to us\n&quot;);</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834599</guid>
        <pubDate>Sun, 19 Jul 2020 07:11:34 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834599</link>
        <description><![CDATA[applegame: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834549'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>korvin &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T14:51:10+00:00">18.07.20, 14:51</time></span><div class='quote '>Обычно — нет. А финализаторы в Java давно признаны слишком проблемными. Поэтому ресурсы нужно использовать с try-with-resources.</div></div>Да, наверное ты прав, обычно нет. Та же фигня и с деструкторами классов в D.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834556'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T16:01:38+00:00">18.07.20, 16:01</time></span><div class='quote '>А ты разве не такой пример привел?</div></div>Нет не такой. Мне не нужен был объект владеющий ресурсом, мне нужен был сам ресурс. Под объектом в данном случае я подразумеваю не просто владение, но и предоставление интерфейса для работы с этим ресурсом. В моем случае, интерфейс был реализован через сишные вызовы внешних функций и, я не вижу никакого смысла писать обертку даже просто для владения. Результат запроса (указатель на PGresult), возвращаемый из сишной либы, никуда за пределы одной-единственной функции не попадает. Понимаешь? Этот PQClear встречается <strong class='tag-b'>во всей</strong> моей обертке вокруг libpq <strong class='tag-b'>ровно один раз</strong>, а именно в scope(exit) в одном из методов класса Connection. Ты предлагаешь городить RAII-обертку на случай: &quot;а вдрух когда-нибудь мне понадобится работать с PGresult в нескольких разных местах&quot;? Вот когда понадобится тогда и напишу, но скорее не RAII, а в функциональном стиле, так как считаю что писать RAII исключительно для владения - костыль. Но пока не понадобилось, и я более чем уверен что и не понадобится.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834556'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T16:01:38+00:00">18.07.20, 16:01</time></span><div class='quote '>Не согласен, он все равно лучше, чем явный defer/scope(exit).<br>
Классический пример скоупа - блокировка.</div></div>Тут у тебя неверное сравнение. Ты же скрыл код самого std::lock_guard, в котором присутствует такой же mtx.unlock(). Тогда двай уж и scope(exit) вынесем в отдельную функцию:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;std::lock_guard lock(mtx);</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">}</div></ol></div></div></div></div><br>
против<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;locked(mtx, {</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">&nbsp;&nbsp;});</div></ol></div></div></div></div><br>
И знаешь чем второе лучше первого? Нет бесполезного и странно выглядящего для людей не знающих C++ объявления переменной lock, которая нигде потом явно не используется. То самое создание объекта исключительно ради владения ресурсом и без предоставления интерфейса работы с этим ресурсом. Самый что ни на есть настоящий костыль.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834556'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T16:01:38+00:00">18.07.20, 16:01</time></span><div class='quote '>Верно. И к этому примеру никаких претензий, это аналог RAII, хотя и с ограничениями.<br>
Но ты привел не этот код </div></div>Вообще-то именно такой код я и привел. Более того, только в подобных случаях и уместен scope(exit). Если тебе приходится писать scope(exit) с одним и тем же кодом более одного раза - ты что-то делаешь не так.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834556'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T16:01:38+00:00">18.07.20, 16:01</time></span><div class='quote '>Можно согласиться, что defer/scope(exit) лучше finally(хотя и не сильно).</div></div>Не знаю что за defer (Go?). А вот scope(...) довольно сильно отличается от finally как синтаксисом так и семантикой.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834556'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T16:01:38+00:00">18.07.20, 16:01</time></span><div class='quote '>Но еще лучше using/with/try-with-resources. Тем, что не нужно каждый раз указывать действие по освобождению.</div></div>Ты просто читаешь тему по диагонали  :) Я с самого начала говорил и несколько раз потом повторил, что scope(...) удобен для однократного использования и он умеет работать с чем угодно, а не только с ресурсами. Даже примеры счетчиков запросов приводил. А ты зациклился на ресурсах и DRY. Давай расциклись уже :D<br>
Если тебе нужно работать с ресурсом в разных местах, заверни scope(...) в отдельную функцию (получится тот же using/with/try-with-resources, только лучше, потому что гибче) или делай RAII.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834556'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>D_KEY &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T16:01:38+00:00">18.07.20, 16:01</time></span><div class='quote '>Но RAII выигрывает и у них. Хотя бы тем, что может быть точно так же использован для полей структуры/класса.</div></div>Это как сказать, что вездеход лучше автомобиля, потому что вездеход может быть точно также использован для езды по болотам. :lol:]]></description>
        <author>applegame</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834598</guid>
        <pubDate>Sun, 19 Jul 2020 06:15:16 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834598</link>
        <description><![CDATA[applegame: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T14:19:08+00:00">18.07.20, 14:19</time></span><div class='quote '>Он как раз все верно оценил, если я правильно понял что там произошло.</div></div>Если бы он все верно оценил, он бы так не написал. Очевидно, что он думал, что деструкторы объектов на куче вызываются по тем же правилам, что и деструкторы объектов на стеке.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T14:19:08+00:00">18.07.20, 14:19</time></span><div class='quote '>Ну да, нахер юзать все эти RAII в плюсах. Вот дебилы, правда? че сложно написать delete ptr - где это нужно.</div></div>Ну так они и пишут, в деструкторах оберток и кастомных делетерах unique_ptr.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T14:19:08+00:00">18.07.20, 14:19</time></span><div class='quote '>В Сяшке ровно тот же механизм, только вид с боку. Когда ты юзаешь мой любимый unique_ptr, то это полноценная RAII обертка, и она лишена практически всех недостатков. Например что будет у тебя, если во время выделения ресурса произойдет исключение? Будет очищать ресурс, который не существует?</div></div>Нет в сяшке не тот же. Вызовуться только те scope(), которые успели отработать. Поведение scope(exit) в плане очистки ресурсов полностью совпадает с unique_ptr с кастомным деструктором. Похоже, ты не совсем понял оно работает. Вот посмотри очень короткий пример: <a class='tag-url' href='https://run.dlang.io/is/7jJE7b' target='_blank'>https://run.dlang.io/is/7jJE7b</a><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T14:19:08+00:00">18.07.20, 14:19</time></span><div class='quote '>Ну как не пишут, если пишут? Я ж даже ссылку привел на того, кто написал </div></div>Он начинающий, очевидно. Представь себе, что новичок, заюзал shared_ptr для некоего обекта. Потом зачем-то в деструкторе какой-нибудь RAII-обертки сделал TTF_Quit, а позже в деструкторе объекта торчащем в shared_ptr вызвался TTF_CloseFont. Сегфолт. Похожим образом я много лет назад облажался с boost::asio. Объект сидящий в boost::shared_ptr (в те времена, еще не было std::shared_ptr) пережил другой объект, без которого он не мог нормально работать. Долго не мог понять что за говно, потом понял и больше так не делал. Ибо нефиг.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T14:19:08+00:00">18.07.20, 14:19</time></span><div class='quote '>сам по себе scope(exit) - Не влияет на порядок вызовов деструкторов, я нигде не утверждал что он влияет. </div></div>Ты написал так:<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834364'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-17T10:31:13+00:00">17.07.20, 10:31</time></span><div class='quote '>Ну и к слову, встречал что если класс в D создавать через new, то <strong class='tag-b'>порядок вызовов</strong> с этим scope(exit) - уже <strong class='tag-b'>не такой однозначный</strong>, а все из за GC, так что даже эта &quot;плюшка&quot; может запросто поломать программу.</div></div>Я это понял так, что ты решил, что scope(exit) как-то влияет на это.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T14:19:08+00:00">18.07.20, 14:19</time></span><div class='quote '>Ага, с тебя взял пример. Ты же первый начал рассказывать как без него тяжко в плюсах жить </div></div>Ну я не тащил сюда всякие странные багнутые куски кода. А так да, в C++ нет scope, но есть RAII, а в D есть и scope и RAII. :)<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834548'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T14:19:08+00:00">18.07.20, 14:19</time></span><div class='quote '>Ты как раз таки все понял, просто тебе видимо потроллить хочеца. Я слышал в Java его частенько называют именно так. И название идет от полной конструкции. Finally не фигурирует сам по себе. Так что ты тоже ошибся выходит, если цеплятся к словам, как ты любишь </div></div>Я не сразу понял. Когда я писал try/catch/finally я имел в виду совокупность всех возможных комбинаций и так же понял и твое try/catch/finally.<br>
Важно понимать, что scope(success)/scope(failure)/scope(exit) похожи на try/catch/finally, но отличия достаточно большие.]]></description>
        <author>applegame</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834571</guid>
        <pubDate>Sat, 18 Jul 2020 18:35:32 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834571</link>
        <description><![CDATA[Qraizer: Ну и это я ещё спустил на тормозах const_cast&lt;char*&gt;(std::string::data())]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834570</guid>
        <pubDate>Sat, 18 Jul 2020 18:31:30 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834570</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834567'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T18:16:27+00:00">18.07.20, 18:16</time></span><div class='quote '>Чтобы далеко не посылать.<br>
Первые два load-а читают посимвольно из-за того, что не знают, сколько там данных. Это также вызывает постоянные реаллокации приёмного буфера. Вторые два load-а читают скопом весь файл, заранее сконфигурировав приёмный буфер на требуемый размер. Что-то это мне напоминает... Ах да, std::vector&lt;T&gt; vs T*. Ну разве не прелесть.</div></div><br>
Да, надо свое мутить&#33; :lol: Хотя есть задачи и по важнее. Например &quot;окроссплатформить&quot; чтение/запись в файл по позиционированию по <strong class='tag-b'>off_t</strong> для x32/64.]]></description>
        <author>JoeUser</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834567</guid>
        <pubDate>Sat, 18 Jul 2020 18:16:27 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834567</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834558'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T16:39:37+00:00">18.07.20, 16:39</time></span><div class='quote '>Я бы не стал доверять программе, написанной в нарушение Стандарта и неверно считающей оверхед. Совсем не верно. Вообще.</div></div>Чтобы далеко не посылать.<br>
Первые два load-а читают посимвольно из-за того, что не знают, сколько там данных. Это также вызывает постоянные реаллокации приёмного буфера. Вторые два load-а читают скопом весь файл, заранее сконфигурировав приёмный буфер на требуемый размер. Что-то это мне напоминает... Ах да, std::vector&lt;T&gt; vs T*. Ну разве не прелесть. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-18T18:30:53+00:00">18.07.20, 18:30</time></span></span><br>
Быстренько налобал правильный тест. Теперь все load-ы читают посимвольно в буфер достаточного размера. Полюбуйтесь:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">File test1.fil</div><div class="code_line">C++ istreambuf_iterator &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; &nbsp; 6906 us</div><div class="code_line">C++ stream::rdbuf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; &nbsp; 7737 us (0.89)</div><div class="code_line">libc fread &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp; &nbsp;33049 us (0.21)</div><div class="code_line">POSIX read &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp;2367907 us (0.00)</div><div class="code_line">File test2.fil</div><div class="code_line">C++ istreambuf_iterator &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; &nbsp;13458 us</div><div class="code_line">C++ stream::rdbuf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; &nbsp;15141 us (0.89)</div><div class="code_line">libc fread &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp; &nbsp;64100 us (0.21)</div><div class="code_line">POSIX read &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp;4671184 us (0.00)</div><div class="code_line">File test4.fil</div><div class="code_line">C++ istreambuf_iterator &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; &nbsp;29175 us</div><div class="code_line">C++ stream::rdbuf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; &nbsp;32303 us (0.90)</div><div class="code_line">libc fread &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp; 133641 us (0.22)</div><div class="code_line">POSIX read &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp;9758374 us (0.00)</div><div class="code_line">File test8.fil</div><div class="code_line">C++ istreambuf_iterator &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; &nbsp;60140 us</div><div class="code_line">C++ stream::rdbuf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; &nbsp;65874 us (0.91)</div><div class="code_line">libc fread &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp; 267079 us (0.23)</div><div class="code_line">POSIX read &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; 19191693 us (0.00)</div><div class="code_line">File test16.fil</div><div class="code_line">C++ istreambuf_iterator &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; 117328 us</div><div class="code_line">C++ stream::rdbuf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; 130321 us (0.90)</div><div class="code_line">libc fread &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp; 547789 us (0.21)</div><div class="code_line">POSIX read &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; 38444935 us (0.00)</div><div class="code_line">File test32.fil</div><div class="code_line">C++ istreambuf_iterator &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; 243340 us</div><div class="code_line">C++ stream::rdbuf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : .......... &nbsp; &nbsp; 265980 us (0.91)</div><div class="code_line">libc fread &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; &nbsp;1090477 us (0.22)</div><div class="code_line">POSIX read &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: .......... &nbsp; 75824446 us (0.00)</div></ol></div></div></div></div>]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834566</guid>
        <pubDate>Sat, 18 Jul 2020 17:48:10 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834566</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834517'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T07:22:32+00:00">18.07.20, 07:22</time></span><div class='quote '>А что не так с Delphi?</div></div>Дык он тоже весь на finally. Там практически ничего без SEH написать невозможно, течь будет из всех <s class='tag-s'>щелей</s> контрактов. Посмотри на нормальные Плюсовые сырцы: catch редки, а если и встречаются, то внутри реализаций.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834519'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T08:01:15+00:00">18.07.20, 08:01</time></span><div class='quote '>А зачем так писать? Заворачиваем в функцию и вызываем сколько угодно раз не парясь об освобождении ресурса</div></div>И чем это будет отличаться от классического RAII? Ты ещё не забыл о главном преимуществе scope()ов, за которое радеешь?<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834519'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T08:01:15+00:00">18.07.20, 08:01</time></span><div class='quote '>А вот в случае когда нужен скоуп владеющий ресурсом, RAII зачастую совершенно излишен.</div></div>Вот. Собственно это и есть тот критерий, который оправдано можно закостылить scope()ом... но вдруг и внезапно – скоуп может захотеть владеть разными ресурсами, в разном количестве и с разной стратегией владения. Ну и получите и распишитесь, получили такой маленький упсик. Собственно, всё равно владельцем выступает программист, а скоуп просто выступает в роли послушного исполнителя твоей воли. Ибо дашь ему неверные инструкции, он и исполнит их неверно, а давать приходится постоянно, пусть и одни и те же. В RAII инструкции даются один раз, и они всегда одинаковые. Может быть иногда и не удобно, но всегда надёжно.<br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-18T17:52:31+00:00">18.07.20, 17:52</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834522'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T08:21:20+00:00">18.07.20, 08:21</time></span><div class='quote '>Ну так в моем случае оно тоже автоматическое.</div></div>Не путай с автоматическим контролем и исполнением инвариантов. Исполнение данных тобой инструкций – да, автоматическое. С этим и __attribute__((__cleanup__())) справляется. Интересно, почему его не включали в Стандарт C? Это же так удобно, по твоим словам.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834558</guid>
        <pubDate>Sat, 18 Jul 2020 16:39:37 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834558</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834514'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T06:53:30+00:00">18.07.20, 06:53</time></span><div class='quote '>В среднем fread быстрее.</div></div>Я бы не стал доверять программе, написанной в нарушение Стандарта и неверно считающей оверхед. Совсем не верно. Вообще.]]></description>
        <author>Qraizer</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834556</guid>
        <pubDate>Sat, 18 Jul 2020 16:01:38 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834556</link>
        <description><![CDATA[D_KEY: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834519'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T08:01:15+00:00">18.07.20, 08:01</time></span><div class='quote '>Конечно. RAII - это прекрасная технология, особенно если нужен именно <em class='tag-i'>объект</em> владеющий ресурсом.</div></div><br>
А ты разве не такой пример привел?<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>А вот в случае когда нужен <em class='tag-i'>скоуп</em> владеющий ресурсом, RAII зачастую совершенно излишен.</div></div><br>
Не согласен, он все равно лучше, чем явный defer/scope(exit).<br>
Классический пример скоупа - блокировка.<br>
Сравни:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">std::lock_guard lock(mtx);</div></ol></div></div></div></div><br>
И<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">mtx.lock();</div><div class="code_line">scope(exit) mtx.unlock();</div></ol></div></div></div></div><br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Угадай, как функциональщики без всяких RAII управляют, допустим, транзакциями в БД? :)</div></div><br>
Транзакции не делал, а для управления ресурсами используется bracket pattern в том же haskell:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">main = do &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp;withFile &quot;foo.txt&quot; ReadMode (\handle -&#62; do &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;...)</div></ol></div></div></div></div><br>
<br>
И это как раз то, о чем я говорю.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>В таком случае вероятность забывания написания scope равна вероятности забывания написания деструктора. :) </div></div><br>
Верно. И к этому примеру никаких претензий, это аналог RAII, хотя и с ограничениями.<br>
Но ты привел не этот код ;) <br>
<br>
Именно так сделано в Ruby и Kotlin, например. Да и bracket pattern о том же, по сути. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-07-18T16:14:25+00:00">18.07.20, 16:14</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834526'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T08:46:32+00:00">18.07.20, 08:46</time></span><div class='quote '>Но я привожу примеры, где scope(exit) проще и понятнее и не менее безопасно, чем RAII.</div></div><br>
Пока у тебя не получилось :) <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>scope это скорее про try/catch/finally.</div></div><br>
Можно согласиться, что defer/scope(exit) лучше finally(хотя и не сильно).<br>
Но еще лучше using/with/try-with-resources. Тем, что не нужно каждый раз указывать действие по освобождению.<br>
На том же уровне with*-функции. ИМХО, их сложнее &quot;забыть&quot; использовать плюс они реализуются без изменения языка(как и RAII), что тоже плюс.<br>
Но RAII выигрывает и у них. Хотя бы тем, что может быть точно так же использован для полей структуры/класса.]]></description>
        <author>D_KEY</author>
        <category>Holy Wars</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834549</guid>
        <pubDate>Sat, 18 Jul 2020 14:51:10 +0000</pubDate>
        <title>goto vs break &amp;amp; continue</title>
        <link>https://forum.sources.ru/index.php?showtopic=362619&amp;view=findpost&amp;p=3834549</link>
        <description><![CDATA[korvin: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=362619&view=findpost&p=3834547'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>applegame &#064; <time class="tag-quote__quoted-time" datetime="2020-07-18T13:35:01+00:00">18.07.20, 13:35</time></span><div class='quote '>А при работе с GC ресурсы обычно освобождаются самим GC.</div></div><br>
Обычно — нет. А финализаторы в Java давно признаны слишком проблемными. Поэтому ресурсы нужно использовать с try-with-resources.]]></description>
        <author>korvin</author>
        <category>Holy Wars</category>
      </item>
	
      </channel>
      </rss>
	