<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Журнал системного программиста &#187; c</title>
	<atom:link href="http://sadko.xskernel.org/archives/tag/c/feed" rel="self" type="application/rss+xml" />
	<link>http://sadko.xskernel.org</link>
	<description>блог обо всём и ни о чём</description>
	<lastBuildDate>Wed, 14 Dec 2011 20:21:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Об опасности исключений</title>
		<link>http://sadko.xskernel.org/archives/1580</link>
		<comments>http://sadko.xskernel.org/archives/1580#comments</comments>
		<pubDate>Thu, 12 Nov 2009 18:06:23 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[исключения]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1580</guid>
		<description><![CDATA[Tweet Об опасностях, таящихся в мороженом корме коде, генерирующем исключения. Исключения в C++ достаточно опасны, именно поэтому я стараюсь их не использовать. Давайте разберёмся вот с этим кодом: #include &#60;stdio.h&#62; &#160; class x &#123; public: x&#40;&#41; &#123; printf&#40;&#34;x()\n&#34;&#41;; &#125; ~x&#40;&#41; &#123; printf&#40;&#34;~x()\n&#34;&#41;; &#125; &#125;; &#160; class e &#123; public: e&#40;&#41; &#123; printf&#40;&#34;e()\n&#34;&#41;; &#125; e&#40;const e&#38; [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1580',
  title: 'Об опасности исключений',
  description: 'Об опасностях, таящихся в мороженом корме коде, генерирующем исключения.\nИсключения в C++ достаточно опасны, именно поэтому я стараюсь их не использовать.\nДавайте разберёмся вот с этим кодом:...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1580"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&ETH;&plusmn; &ETH;&frac34;&ETH;&iquest;&ETH;&deg;&Ntilde;&ETH;&frac12;&ETH;&frac34;&Ntilde;&Ntilde;&ETH;&cedil; &ETH;&cedil;&Ntilde;&ETH;&ordm;&ETH;&raquo;&Ntilde;&Ntilde;&ETH;&micro;&ETH;&frac12;&ETH;&cedil;&ETH;&sup1;" data-url="http://sadko.xskernel.org/archives/1580">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Об опасностях, таящихся в <strike>мороженом корме</strike> коде, генерирующем исключения.<br />
Исключения в C++ достаточно опасны, именно поэтому я стараюсь их не использовать.<br />
Давайте разберёмся вот с этим кодом:<br />
<span id="more-1580"></span></p>

<div class="wp_codebox"><table><tr id="p15806"><td class="code" id="p1580code6"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> x
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;x()<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
        ~x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;~x()<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> e
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        e<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;e()<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
        e<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> e<span style="color: #000040;">&amp;</span> src<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;e(src)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
        ~e<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;~e()<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> g<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">throw</span> e<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    x<span style="color: #000040;">*</span> ptr <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    g<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">delete</span> ptr<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">try</span>
    <span style="color: #008000;">&#123;</span>
        f<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">catch</span> <span style="color: #008000;">&#40;</span>e<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Caught exception e<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Казалось бы, достаточно простой код, но он таит в себе Memory leak: объект класса x создаётся, но никогда не уничтожается. Это очень вырожденный пример, но он передаёт очень важную суть: если вы не ожидаете от функции g(), что она будет генерировать исключение, и пишете код, то когда функция g() начинает генерировать исключения, код становится работающим некорректно, в чём вы и можете убедиться, запустив программу:</p>
<pre>
x()
e()
e(src)
Caught exception e
~e()
~e()
</pre>
<p>Обойти это можно, сделав класс-обвязку (а-ля smart ptr):</p>

<div class="wp_codebox"><table><tr id="p15807"><td class="code" id="p1580code7"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> ptr<span style="color: #000080;">&gt;</span>
    <span style="color: #0000ff;">class</span> p
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
            ptr <span style="color: #000040;">*</span>m_ptr<span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
            p<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> m_ptr<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
            p<span style="color: #008000;">&#40;</span>ptr <span style="color: #000040;">*</span>pp<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span> m_ptr<span style="color: #008000;">&#40;</span>pp<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
            ~p<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>m_ptr<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #0000dd;">delete</span> m_ptr<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
            ptr <span style="color: #000040;">*</span>drop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                ptr <span style="color: #000040;">*</span>res <span style="color: #000080;">=</span> m_ptr<span style="color: #008080;">;</span>
                <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>m_ptr<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    <span style="color: #0000dd;">delete</span> m_ptr<span style="color: #008080;">;</span>
                    m_ptr <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
                <span style="color: #008000;">&#125;</span>
                <span style="color: #0000ff;">return</span> res<span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            ptr <span style="color: #000040;">&amp;</span>operator <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span>m_ptr<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
            ptr <span style="color: #000040;">&amp;</span>operator <span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">*</span>m_ptr<span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #0000ff;">bool</span> validate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> m_ptr <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
            operator <span style="color: #0000ff;">bool</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">return</span> m_ptr <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>И переписав функцию f():</p>

<div class="wp_codebox"><table><tr id="p15808"><td class="code" id="p1580code8"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    p<span style="color: #000080;">&lt;</span>x<span style="color: #000080;">&gt;</span> ptr<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">new</span> x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ptr<span style="color: #008000;">&#41;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;OK, validated<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    g<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Получаем вполне нормальное поведение:</p>
<pre>
x()
OK, validated
e()
~x()
e(src)
Caught exception e
~e()
~e()
</pre>
<p>Но&#8230; Если функция g() была использована во многих местах, это же получается тотальный рефакторинг кода! И не надо меня убеждать в том, что изначально надо было пользоваться штуками типа smart ptr!</p>
<p>Решить проблему можно, сделав сеппуку для функции g() и разбив её на две функции: враппер и, собственно, саму реализацию, то есть:</p>

<div class="wp_codebox"><table><tr id="p15809"><td class="code" id="p1580code9"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> _g<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">throw</span> e<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> g<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">try</span>
    <span style="color: #008000;">&#123;</span>
        _g<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">catch</span> <span style="color: #008000;">&#40;</span>e<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Caught exception e<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    x <span style="color: #000040;">*</span>ptr <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    g<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000dd;">delete</span> ptr<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    f<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>То есть, мы избежим тотального рефакторинга, но при этом сможем пользоваться новой функцией _g(), которая будет кидать исключения. С другой стороны, это не всегда корректно. Представим себе ситуацию, что генерация исключения e() требует обязательного освобождения какого-либо ресурса, о котором функция _g() не знает (и ввиду её специфичной реализации не должна знать). Тогда если код, который будет отлавливать исключение e(), будет неявно пользоваться и g(), и _g(), то он рискует не освободить ресурс, когда это надо. Характерный пример:</p>

<div class="wp_codebox"><table><tr id="p158010"><td class="code" id="p1580code10"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> x
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
        x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;x()<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
        ~x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;~x()<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">void</span> alarm<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span> <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;alarm!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> _g<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">throw</span> e<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> g<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">try</span>
    <span style="color: #008000;">&#123;</span>
        _g<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">catch</span> <span style="color: #008000;">&#40;</span>e<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Caught exception e<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> z<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">bool</span> r<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#41;</span> g<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">else</span> _g<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">bool</span> r<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    x <span style="color: #000040;">*</span>ptr <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> x<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">try</span>
    <span style="color: #008000;">&#123;</span>
        z<span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">catch</span> <span style="color: #008000;">&#40;</span>e<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        ptr<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>alarm<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000dd;">delete</span> ptr<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    f<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>В результате выполнения получаем:</p>
<pre>
x()
e()
e(src)
Caught exception e
~e()
~e()
~x()
x()
e()
e(src)
alarm!
~e()
~e()
~x()
</pre>
<p>То есть, &#171;Caught exception e&#187; для нас &#8212; это неожиданная ситуация, так как мы ожидаем, что если _g() не отработала, то мы  должны сами словить исключение и получить &#171;alarm!&#187;.</p>
<p>Таким образом, исключения в C++ таят достаточно большую опасность, если их использовать неаккуратно. Попытка обойти подобную ситуацию есть в java &#8212; это специальная директива throws у метода, которая вынуждает разработчика либо ловить исключение, либо передавать его дальше, что, хоть, и не спасает от генерации Runtime Exception, но помогает сразу найти места, где вызывается метод, который генерирует исключение (потому что иначе просто ничего не скомпилится).</p>
<p>В общем, на этом пока мысли останавливаются.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1580/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Функциональное программирование там, где оно не нужно.</title>
		<link>http://sadko.xskernel.org/archives/1513</link>
		<comments>http://sadko.xskernel.org/archives/1513#comments</comments>
		<pubDate>Sun, 27 Sep 2009 22:24:11 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[быдлокод]]></category>
		<category><![CDATA[ооп]]></category>
		<category><![CDATA[функциональное]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1513</guid>
		<description><![CDATA[Tweet В современном программистском мире появилась тенденция к изучению функциональных языков программирования. И на них сейчас пытаются выразить всё, что только под руку попадётся. Я называю это никак иначе как мозговым онанизмом. Сразу оговорюсь: я не знаю парадигмы функционального программирования. И вряд ли её буду изучать до тех пор, пока мне это не понадобится. Но [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1513',
  title: 'Функциональное программирование там, где оно не нужно.',
  description: 'В современном программистском мире появилась тенденция к изучению функциональных языков программирования. И на них сейчас пытаются выразить всё, что только под руку попадётся. Я называю это...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1513"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&curren;&Ntilde;&ETH;&frac12;&ETH;&ordm;&Ntilde;&ETH;&cedil;&ETH;&frac34;&ETH;&frac12;&ETH;&deg;&ETH;&raquo;&Ntilde;&ETH;&frac12;&ETH;&frac34;&ETH;&micro; &ETH;&iquest;&Ntilde;&ETH;&frac34;&ETH;&sup3;&Ntilde;&ETH;&deg;&ETH;&frac14;&ETH;&frac14;&ETH;&cedil;&Ntilde;&ETH;&frac34;&ETH;&sup2;&ETH;&deg;&ETH;&frac12;&ETH;&cedil;&ETH;&micro; &Ntilde;&ETH;&deg;&ETH;&frac14;, &ETH;&sup3;&ETH;&acute;&ETH;&micro; &ETH;&frac34;&ETH;&frac12;&ETH;&frac34; &ETH;&frac12;&ETH;&micro; &ETH;&frac12;&Ntilde;&ETH;&para;&ETH;&frac12;&ETH;&frac34;." data-url="http://sadko.xskernel.org/archives/1513">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>В современном программистском мире появилась тенденция к изучению функциональных языков программирования. И на них сейчас пытаются выразить всё, что только под руку попадётся. Я называю это никак иначе как мозговым онанизмом. </p>
<p>Сразу оговорюсь: я не знаю парадигмы функционального программирования. И вряд ли её буду изучать до тех пор, пока мне это не понадобится. Но то, что, извините, вытворяют функциональщики, порой меня шокирует: решать элементарные задачи через, простите меня, жопу &#8212; это выше моих сил и нервов. Зато это повышает ЧСВ аффтаров до уровня over 9000, что очень настораживает и порой порождает сомнения в их адекватности.<br />
Вот характерный разговор с товарищем <a href="http://users.livejournal.com/ivansorokin/profile/"><img src="http://stat.livejournal.com/img/userinfo.gif" style="border: 0pt none ; vertical-align: bottom;" height="17" width="17"></a><a href="http://users.livejournal.com/ivansorokin/"><b>ivansorokin</b></a> (осторожно, русский мат).<br />
<span id="more-1513"></span></p>
<blockquote><p>
ivansorokin:<br />
void char_count_2(string s)<br />
{<br />
    std::sort(s.begin(), s.end());</p>
<p>    auto i = s.begin();<br />
    while (i != s.end())<br />
    {<br />
        auto j = find_if(next(i), s.end(), _1 != *i);<br />
        cout << *i << ": " << (j - i) << endl;<br />
        i = j;<br />
    }<br />
}<br />
SadKo: изврат?<br />
ivansorokin: порно <img src='http://sadko.xskernel.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
SadKo: согласен<br />
ivansorokin: обрати внимание что под find_if написано. _1 != *i. ищем элемент не равный *i<br />
SadKo: мда<br />
ivansorokin: а что?<br />
SadKo: быдлокод<br />
ivansorokin: ты ничего не понимаешь в функциональном программировании <img src='http://sadko.xskernel.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  boost/lambda епть <img src='http://sadko.xskernel.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
SadKo: ну его нахер, это функциональное программирование, если оно позволяет плодить ЭТО.<br />
ivansorokin: быдло пишет всякое дерьмо с указателями<br />
    int cnt[256];<br />
    char *p;<br />
    int i;</p>
<p>    // str is pointer to input zero-terminated string;</p>
<p>    for(p = str; *p; ++cnt[*p++]);<br />
    for(i = 0; i < 256; i++) {<br />
        if(cnt[i]) printf("%c = %d\n", i, cnt[i]);<br />
    }<br />
такое дерьмо лучше?<br />
SadKo: оно быстрее<br />
ivansorokin: о госпади<br />
SadKo: а вы любите ездить в Лондон через Нью-Йорк<br />
ivansorokin: а тех кто пишет на Питоне, тогда вообще расстрелять<br />
SadKo: Я к тому, что простую задачу превратили в какую-то хуйню. Или меряться функциональными пиписьками ща модно?<br />
ivansorokin: модно, трендово...<br />
SadKo: Так вот, послушай меня. То, что модно, диктуют всякие мудаки. Надо использовать не то, что модно, а то, что работает.<br />
ivansorokin: var q = from a in array group a by a into g select new {a, g.Count()}<br />
SadKo: буээээ
</p></blockquote>
<p>Я <u>не отрицаю</u> тот факт, что, возможно, функциональные языки нужны и ряд задач при помощи функциональных языков решается легче, быстрее и проще, нежели через привычные нам объектные языки. Тем не менее, это не означает, что абсолютно всё можно решить быстро, элегантно и красиво с помощью функционального программирования. И фанаты Python, Haskell, BOOST/C++ и иже с ним должны это понимать и, как говорится, &#171;знать меру&#187;.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1513/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Кодирование Хаффмана.</title>
		<link>http://sadko.xskernel.org/archives/1060</link>
		<comments>http://sadko.xskernel.org/archives/1060#comments</comments>
		<pubDate>Wed, 15 Apr 2009 21:01:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[c]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/1060</guid>
		<description><![CDATA[Tweet Забавно, но стал в последнее время замечать, что на мой сайт регулярно заходят в поисках алгоритмов сжатия по Хаффману. Да, будучи студентом второго курса, я изучал этот метод кодирования и даже написал демонстрационные программы для сжатия/распаковки файлов (от реальных их отличают некоторые ограничения в использовании). И даже написал три статьи (по теории, кодированию и [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1060',
  title: 'Кодирование Хаффмана.',
  description: 'Забавно, но стал в последнее время замечать, что на мой сайт регулярно заходят в поисках алгоритмов сжатия по Хаффману. Да, будучи студентом второго курса, я изучал этот метод кодирования и да...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1060"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&ETH;&frac34;&ETH;&acute;&ETH;&cedil;&Ntilde;&ETH;&frac34;&ETH;&sup2;&ETH;&deg;&ETH;&frac12;&ETH;&cedil;&ETH;&micro; &ETH;&yen;&ETH;&deg;&Ntilde;&Ntilde;&ETH;&frac14;&ETH;&deg;&ETH;&frac12;&ETH;&deg;." data-url="http://sadko.xskernel.org/archives/1060">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Забавно, но стал в последнее время замечать, что на мой сайт регулярно заходят в поисках алгоритмов сжатия по Хаффману. Да, будучи студентом второго курса, я изучал этот метод кодирования и даже написал демонстрационные программы для сжатия/распаковки файлов (от реальных их отличают некоторые ограничения в использовании). И даже написал три статьи (по теории, кодированию и декодированию) в набиравшем в своё время обороты журнале eXcode eZine, который, к сожалению, скончался.</p>
<p>Тем не менее, статьи у меня остались, и две я уже выложил у себя на вики в разделе <a href="http://wiki.xskernel.org/doku.php/articles">&#171;Статьи&#187;</a>. Третью всё пока не соберусь перевести из html в wiki-формат.</p>
<p>Тем не менее, мой сервер регулярно штурмуют вопросами вроде &#171;Пример реализации алгоритма Хаффмана на языке C++&#187;. Что ж, мне приятно, что труд мой не пропал для кого-то даром. Тем не менее, также берёт обида за то, что такие вещи можно и самостоятельно реализовать, благо алгоритм кодирования/декодирования очень прост.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1060/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C мёртв? $#%&amp;!!!</title>
		<link>http://sadko.xskernel.org/archives/916</link>
		<comments>http://sadko.xskernel.org/archives/916#comments</comments>
		<pubDate>Wed, 30 May 2007 16:20:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[c]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/archives/916</guid>
		<description><![CDATA[Tweet Вот, почитал статью: http://www.xakep.ru/post/38388/default.asp Такое ощущение, что автор только всю жизнь и программировал на паскале. Он пытается сравнить системные языки программирования с чисто прикладными. Возникновение монструозно сложного языка C++, сочиненного путем тупого добавления к C без исправления его многочисленных дефектов модных конструкций объектно-ориентированного программирования Ну уж извольте. Если бы не было потребности, то язык [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/916',
  title: 'C мёртв? $#%&amp;!!!',
  description: 'Вот, почитал статью:\nhttp://www.xakep.ru/post/38388/default.asp\n\nТакое ощущение, что автор только всю жизнь и программировал на паскале.\nОн пытается сравнить системные языки программирования с чисто прикладны...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/916"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="C &ETH;&frac14;&Ntilde;&Ntilde;&Ntilde;&ETH;&sup2;? $#%&amp;#038;!!!" data-url="http://sadko.xskernel.org/archives/916">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Вот, почитал статью:</p>
<p>http://www.xakep.ru/post/38388/default.asp</p>
<p>Такое ощущение, что автор только всю жизнь и программировал на паскале.<br />
Он пытается сравнить системные языки программирования с чисто прикладными.<br />
<i>Возникновение монструозно сложного языка C++, сочиненного путем тупого добавления к C без исправления его многочисленных дефектов модных конструкций объектно-ориентированного программирования</i><br />
Ну уж извольте. Если бы не было потребности, то язык не возник бы. Язык не сложный, просто нужно иметь пару извилин и помнить, что можно делать, а что нельзя.<br />
<i>Отсюда понятно, почему серьезные специалисты употребляют такие сильные выражения как «развращение малолетних», «интеллектуальная зараза» и т.п., говоря о языках C/C++.</i><br />
Нет, не понятно. Это понятно автору статьи, который не в состоянии часок-другой посидеть с языком и разобраться в его тонкостях. Я понимаю &#171;развращение малолетних&#187; как тот факт, что С++ новичкам освоить сложно. Хотя бы потому, что в нём много тонкостей.<br />
<i>Подчеркнем, что BlackBox, хотя и аналогичен виртуальным машинам Java и .NET, но работает с эффективным компилируемым кодом. Благодаря этому программы, написанные на Компонентном Паскале в Блэкбоксе, качественно более эффективны, чем программы на Java и С#.</i><br />
Бред. Откровенный бред. И меня больше всего добило это:<br />
<i>При создании C была проигнорирована вся накопленная к тому времени мудрость создания высоконадежных языков программирования. В результате на C легко написать совершенно нечитаемые конструкции.</i><br />
А зачем эти конструкции писать? Чтобы выпендриться перед кем-то? А про искусство оформления кода мы вообще забыли, да? Про то, что надо писать программы понятно, чтобы любой другой человек с минимумом усилий их понимал.</p>
<p>Итог: намешали в кучу Pascal, C, C++, C#, Java, Oberon, Blackbox. При этом не было сказано, для какой конкретной задачи используется тот или иной язык. C++ не подойдёт для написания всяких веб-систем, работающих через браузеры &#8212; имхо очень сложно. В то время, как Java или тот же C# не подойдут для написания операционной системы. Из-за их прикладного характера.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/916/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

