<?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://www.devexp.ru/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.devexp.ru</link>
	<description>Сборник рецептов</description>
	<lastBuildDate>Tue, 15 Nov 2011 18:38:30 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Многопоточность, баги и списки инициализации</title>
		<link>http://www.devexp.ru/2011/11/mnogopotochnost-bagi-i-spiski-inicializacii/</link>
		<comments>http://www.devexp.ru/2011/11/mnogopotochnost-bagi-i-spiski-inicializacii/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 18:38:30 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[Многопоточность]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2011/11/mnogopotochnost-bagi-i-spiski-inicializacii/</guid>
		<description><![CDATA[Разработка многопоточных программ – задача нетривиальная. Локализовать место ошибки сложно, отладка затруднена, иногда даже возникает желание все свалить на ошибки в сторонних библиотеках и/или компилятор/операционную систему. Так делать не надо. Конечно вероятность такая есть, но она несравненно меньше того, что виновником ошибки являетесь именно вы.
Например приложение работает хорошо, ну скажем в 95 случаях из 100, [...]]]></description>
			<content:encoded><![CDATA[<p>Разработка многопоточных программ – задача нетривиальная. Локализовать место ошибки сложно, отладка затруднена, иногда даже возникает желание все свалить на ошибки в сторонних библиотеках и/или компилятор/операционную систему. Так делать не надо. Конечно вероятность такая есть, но она несравненно меньше того, что виновником ошибки являетесь именно вы.</p>
<p>Например приложение работает хорошо, ну скажем в 95 случаях из 100, но в оставшихся пяти оно может зависнуть или вылететь с segmentation fault. А может упасть на таком ассерте:</p>
<pre>/usr/include/boost/thread/pthread/mutex.hpp:51:
	void boost::mutex::lock(): Assertion `!pthread_mutex_lock(&amp;m)' failed. </pre>
<p><br clear="all" /></p>
<p>Посмотрим на следующий код:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;queue&gt;</span>
&nbsp;
<span style="color: #339900;">#include &lt;boost/thread.hpp&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Worker
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Worker<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008080;">:</span> Shutdown_<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#41;</span>
		, Thread_<span style="color: #008000;">&#40;</span>boost<span style="color: #008080;">::</span><span style="color: #007788;">thread</span><span style="color: #008000;">&#40;</span>boost<span style="color: #008080;">::</span><span style="color: #007788;">bind</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>Worker<span style="color: #008080;">::</span><span style="color: #007788;">ThreadFunction</span>, <span style="color: #0000dd;">this</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	~Worker<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #008000;">&#123;</span>
			boost<span style="color: #008080;">::</span><span style="color: #007788;">mutex</span><span style="color: #008080;">::</span><span style="color: #007788;">scoped_lock</span> lock<span style="color: #008000;">&#40;</span>Mutex_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			Shutdown_ <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
&nbsp;
		Condition_.<span style="color: #007788;">notify_one</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		Thread_.<span style="color: #007788;">join</span><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> AddTask<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> taskId<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #008000;">&#123;</span>
			boost<span style="color: #008080;">::</span><span style="color: #007788;">mutex</span><span style="color: #008080;">::</span><span style="color: #007788;">scoped_lock</span> lock<span style="color: #008000;">&#40;</span>Mutex_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
			std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Adding task &quot;</span> <span style="color: #000080;">&lt;&lt;</span> taskId <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
&nbsp;
			Tasks_.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>taskId<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
&nbsp;
		Condition_.<span style="color: #007788;">notify_one</span><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;">private</span><span style="color: #008080;">:</span>
	<span style="color: #0000ff;">void</span> ThreadFunction<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			boost<span style="color: #008080;">::</span><span style="color: #007788;">mutex</span><span style="color: #008080;">::</span><span style="color: #007788;">scoped_lock</span> lock<span style="color: #008000;">&#40;</span>Mutex_<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>Tasks_.<span style="color: #007788;">empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
			 std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Processing task &quot;</span> <span style="color: #000080;">&lt;&lt;</span> Tasks_.<span style="color: #007788;">front</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
&nbsp;
			 Tasks_.<span style="color: #007788;">pop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
&nbsp;
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Shutdown_<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
			 <span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
&nbsp;
			Condition_.<span style="color: #007788;">wait</span><span style="color: #008000;">&#40;</span>lock<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;">private</span><span style="color: #008080;">:</span>
	<span style="color: #0000ff;">bool</span> Shutdown_<span style="color: #008080;">;</span>
&nbsp;
	std<span style="color: #008080;">::</span><span style="color: #007788;">queue</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> Tasks_<span style="color: #008080;">;</span>
&nbsp;
	boost<span style="color: #008080;">::</span><span style="color: #007788;">thread</span> Thread_<span style="color: #008080;">;</span>
	boost<span style="color: #008080;">::</span><span style="color: #007788;">mutex</span> Mutex_<span style="color: #008080;">;</span>
	boost<span style="color: #008080;">::</span><span style="color: #007788;">condition_variable</span> Condition_<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	Worker worker<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span> i <span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">6</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		worker.<span style="color: #007788;">AddTask</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Здесь приведен простой класс, объект которого обрабатывает некоторые задачи в параллельном потоке. Из основного потока функцией AddTask можно добавить задачу в очередь и известить об этом параллельный поток. Поток проснувшись, возьмет из очереди задачу, обработает ее и если задач больше нет – уснет. В деструкторе, прежде чем объект будет уничтожен происходит ожидание обработки всех задач в очереди.</p>
<p>На первый взгляд все прозрачно, но в некоторых случаях, мы вылетим по ассерту из boost (и даже можем начать грешить на его разработчиков) или зависнем, но повторюсь – ошибка здесь наша.</p>
<p>Проблема в списке инициализации. Как мы помним, конструирование членов класса происходит в порядке их объявления. В нашем случае сначала будет создан объект типа <strong>boost::thread</strong> и только после него <strong>boost::mutex</strong>. Если звезды сложатся удачно, то запуск параллельного потока займет некоторое время, за которое в основном потоке будет сконструирован мютекс и программа будет работать. Если со звездами не сложиться, то поток начав работу попробует заблокировать мютекс который еще не сконструирован, со всеми вытекающими. Решение простое – изменить положение членов в списке инициализации:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">boost<span style="color: #008080;">::</span><span style="color: #007788;">mutex</span> Mutex_<span style="color: #008080;">;</span>
boost<span style="color: #008080;">::</span><span style="color: #007788;">condition_variable</span> Condition_<span style="color: #008080;">;</span>
boost<span style="color: #008080;">::</span><span style="color: #007788;">thread</span> Thread_<span style="color: #008080;">;</span></pre></div></div>

<img src="http://www.devexp.ru/?ak_action=api_record_view&id=84&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2011, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2011/11/mnogopotochnost-bagi-i-spiski-inicializacii/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2011/11/mnogopotochnost-bagi-i-spiski-inicializacii/#comments">Нет комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2011/11/mnogopotochnost-bagi-i-spiski-inicializacii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ 0x == C++ 0xB</title>
		<link>http://www.devexp.ru/2011/03/c-0x-c-0xb/</link>
		<comments>http://www.devexp.ru/2011/03/c-0x-c-0xb/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 11:20:31 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2011/03/c-0x-c-0xb/</guid>
		<description><![CDATA[Принят финальный драфт нового стандарта C++.&#160; http://herbsutter.com/2011/03/25/we-have-fdis-trip-report-march-2011-c-standards-meeting/
Ура, товарищи!
Update. Собственно сам драфт: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf


Copyright &#169; 2011, Личный опыт разработки ПО. 
Все права защищены. &#124;
Постоянная ссылка &#124;
4 комментариев

Хотите узнать больше? Посмотреть все записи в категории C++,  Новости.]]></description>
			<content:encoded><![CDATA[<p>Принят финальный драфт нового стандарта C++.&#160; <a href="http://herbsutter.com/2011/03/25/we-have-fdis-trip-report-march-2011-c-standards-meeting/">http://herbsutter.com/2011/03/25/we-have-fdis-trip-report-march-2011-c-standards-meeting/</a></p>
<p>Ура, товарищи!</p>
<p><strong>Update. </strong>Собственно сам драфт: <a title="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf</a></p>
<img src="http://www.devexp.ru/?ak_action=api_record_view&id=79&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2011, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2011/03/c-0x-c-0xb/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2011/03/c-0x-c-0xb/#comments">4 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>,  <a href="http://www.devexp.ru/category/novosti/" title="Просмотреть все записи в Новости" rel="category tag">Новости</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2011/03/c-0x-c-0xb/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Конечные автоматы в C++</title>
		<link>http://www.devexp.ru/2011/02/konechnye-avtomaty-v-c/</link>
		<comments>http://www.devexp.ru/2011/02/konechnye-avtomaty-v-c/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 20:05:27 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Алгоритмы]]></category>
		<category><![CDATA[Boost]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2011/02/konechnye-avtomaty-v-c/</guid>
		<description><![CDATA[В статье рассмотрены простые конечные автоматы и их реализация на C++ с помощью switch-конструкций, таблиц времени исполнения и библиотеки Boost Statechart.
Введение
Грубо говоря, конечный автомат (Finite State Machine), глазами пользователя – это черный ящик, в который можно что-то передать и что-то оттуда получить. Это очень удобная абстракция, которая позволяет скрыть сложный алгоритм, кроме того конечные автоматы [...]]]></description>
			<content:encoded><![CDATA[<p>В статье рассмотрены простые конечные автоматы и их реализация на C++ с помощью switch-конструкций, таблиц времени исполнения и библиотеки <a href="http://www.boost.org/doc/libs/1_45_0/libs/statechart/doc/index.html">Boost Statechart</a>.</p>
<h2>Введение</h2>
<p>Грубо говоря, конечный автомат (Finite State Machine), глазами пользователя – это черный ящик, в который можно что-то передать и что-то оттуда получить. Это очень удобная абстракция, которая позволяет скрыть сложный алгоритм, кроме того конечные автоматы очень эффективны.</p>
<p>Конечные автоматы изображают в виде диаграмм состоящих из состояний и переходов. Поясню на простом примере:</p>
<p><img src="http://www.devexp.ru/wp-content/uploads/2011/02/lamp.png" /></p>
<p>Как вы наверное догадались – это диаграмма состояний лампочки. Начальное состояние обозначается черным кружком, переходы стрелками, некоторые стрелки подписаны – это события после которых автомат переходит в другое состояние. Итак, сразу из начального состояния, мы попадаем в состояние <strong>Light Off</strong> – лампа не горит. Если нажать кнопку, то автомат изменит свое состояние и перейдет по стрелке помеченной <strong>Push Button</strong>, в состояние <strong>Light On</strong> – лампа горит. Перейти из этого состояния можно опять же по стрелке, после нажатия кнопки, в состояние <strong>Light Off</strong>.</p>
<p>Также широко используются таблицы переходов:</p>
<table border="1" width="100%">
<tbody>
<tr>
<td><strong>Текущее состояние</strong></td>
<td><strong>Событие</strong></td>
<td><strong>Состояние после перехода</strong></td>
<td><strong>Действие</strong></td>
</tr>
<tr>
<td>Light Off</td>
<td>Push Button</td>
<td>Light On</td>
<td>Загорается лампа</td>
</tr>
<tr>
<td>Light On</td>
<td>Push Button</td>
<td>Light Off</td>
<td>Лампа гаснет</td>
</tr>
</tbody>
</table>
<h2>Практическое применение автоматов</h2>
<p>Конечные автоматы широко используются в программировании. Например очень удобно представить работу устройства в виде автомата. Это сделает код проще и позволит легко с ним экспериментировать и поддерживать.</p>
<p>Также конечные автоматы применяют для написания всевозможных парсеров и анализаторов текста, с помощью них можно эффективно проводить поиск подстрок, регулярные выражения тоже транслируются в конечный автомат.</p>
<p>  <p style="text-align: right"><a href="http://www.devexp.ru/2011/02/konechnye-avtomaty-v-c/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2011, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2011/02/konechnye-avtomaty-v-c/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2011/02/konechnye-avtomaty-v-c/#comments">2 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>,  <a href="http://www.devexp.ru/category/algoritmy/" title="Просмотреть все записи в Алгоритмы" rel="category tag">Алгоритмы</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2011/02/konechnye-avtomaty-v-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Использование Cppcheck для статического анализа кода</title>
		<link>http://www.devexp.ru/2011/01/ispolzovanie-cppcheck-dlya-staticheskogo-analiza-koda/</link>
		<comments>http://www.devexp.ru/2011/01/ispolzovanie-cppcheck-dlya-staticheskogo-analiza-koda/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 18:29:11 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Cppcheck]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2011/01/ispolzovanie-cppcheck-dlya-staticheskogo-analiza-koda/</guid>
		<description><![CDATA[Что такое статический анализатор кода? Это программа, которая проверяет исходный код программы и пытается найти в нем ошибки. Иногда это у нее ловко получается. Диагностируются выходы за границы массивов, утечки памяти, использование неинициализированных переменных и прочие неприятные вещи. Часто минутный прогон программы позволяет сэкономить час работы в отладчике в поисках бага.
Цена вопроса
Есть программы которые стоят [...]]]></description>
			<content:encoded><![CDATA[<p>Что такое статический анализатор кода? Это программа, которая проверяет исходный код программы и пытается найти в нем ошибки. Иногда это у нее ловко получается. Диагностируются выходы за границы массивов, утечки памяти, использование неинициализированных переменных и прочие неприятные вещи. Часто минутный прогон программы позволяет сэкономить час работы в отладчике в поисках бага.</p>
<h2>Цена вопроса</h2>
<p>Есть программы которые стоят немалых денег (<a href="http://www.coverity.com/html/prevent-for-c-c++.html">Coverity Prevent for C/C++</a>, <a href="http://www.klocwork.com/">Klocwork</a>), а есть абсолютно бесплатные (<a href="http://cppcheck.sourceforge.net/">Cppcheck</a>).</p>
<p>Платные я не тестировал, но судя по <a href="http://easy-coding.blogspot.com/2009/02/blog-post_23.html">статье</a>, Cppcheck им нисколько не уступает. Так на тесте приведенном в указанной статье она находит все ошибки. Вот результат работы:</p>
<pre>Checking check.cpp...
[check.cpp:11]: (error) Array 'c[10]' index 10 out of bounds
[check.cpp:5]: (error) Memory leak: __p
[check.cpp:17]: (error) Memory leak: a
[check.cpp:14]: (error) Mismatching allocation and deallocation: A::__p
[check.cpp:8]: (error) Null pointer dereference </pre>
<p>&#160;</p>
<p>Кроме затрат материальных, у инструментов есть определенный уровень вхождения, который некоторых может остановить. Я человек ленивый, поэтому мне особенно приятно, что у данного инструмента этот порог очень низкий.</p>
<p>Есть версия программы с графическим интерфейсом, где единственное усилие которое нужно сделать – выбрать пункт меню <strong>Check-&gt;Files</strong> для проверки одного файла, или <strong>Check-&gt;Directory </strong>для проверки всей директории, после чего просмотреть результаты работы.</p>
<p>Также есть консольная версия, на вход которой также достаточно подать&#160; имена проверяемых файлов.</p>
<h2>Интеграция в систему сборки</h2>
<p>Уже упомянутую консольную версию программы легко добавить в скрипт сборки проекта, чтобы автоматически проводить проверку. При этом Cppcheck может в случае нахождения ошибок вернуть определенный код. Используйте для этого ключ <strong>&#8211;error-exitcode=код_возврата</strong>.</p>
<h2>Вывод</h2>
<p>Cppcheck отличный инструмент, очень простой в использовании, бесплатный и довольно эффективный. Крайне рекомендую к использованию. Есть версии как для Windows, так и для Linux.</p>
<p>Домашняя страница проекта: <a href="http://cppcheck.sourceforge.net/">http://cppcheck.sourceforge.net/</a></p>
<img src="http://www.devexp.ru/?ak_action=api_record_view&id=74&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2011, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2011/01/ispolzovanie-cppcheck-dlya-staticheskogo-analiza-koda/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2011/01/ispolzovanie-cppcheck-dlya-staticheskogo-analiza-koda/#comments">Один комментарий</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>,  <a href="http://www.devexp.ru/category/instrumenty/" title="Просмотреть все записи в Инструменты" rel="category tag">Инструменты</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2011/01/ispolzovanie-cppcheck-dlya-staticheskogo-analiza-koda/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Use of undefined type</title>
		<link>http://www.devexp.ru/2010/03/use-of-undefined-type/</link>
		<comments>http://www.devexp.ru/2010/03/use-of-undefined-type/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 18:47:25 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/03/use-of-undefined-type/</guid>
		<description><![CDATA[Давайте поговорим о неприятных граблях связанных с удалением неполного типа, что может привести к крайне неприятным последствиям, например милому сердцу Segmentation fault. Связано это с двумя вещами:

Полномочиями данными компилятору автоматически генерировать деструктор, если он не определен в классе 
Возможностью вызвать оператор delete для объекта тип которого в точке удаления еще не известен 

Рассмотрим простой код [...]]]></description>
			<content:encoded><![CDATA[<p>Давайте поговорим о неприятных граблях связанных с удалением неполного типа, что может привести к крайне неприятным последствиям, например милому сердцу <strong>Segmentation fault</strong>. Связано это с двумя вещами:</p>
<ol>
<li>Полномочиями данными компилятору автоматически генерировать деструктор, если он не определен в классе </li>
<li>Возможностью вызвать оператор delete для объекта тип которого в точке удаления еще не известен </li>
</ol>
<p>Рассмотрим простой код и посмотрим, что делает компилятор:</p>
<p><strong>test.h</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifndef TEST_H</span>
<span style="color: #339900;">#define TEST_H</span>
&nbsp;
<span style="color: #0000ff;">class</span> Test
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	~Test<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: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#endif//TEST_H</span></pre></div></div>

<p><strong>test.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
&nbsp;
<span style="color: #339900;">#include &quot;test.h&quot;</span>
&nbsp;
Test<span style="color: #008080;">::</span><span style="color: #007788;">Test</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Test&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
Test<span style="color: #008080;">::</span>~Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;~Test&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><strong>trouble.h</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifndef TROUBLE_H</span>
<span style="color: #339900;">#define TROUBLE_H</span>
&nbsp;
<span style="color: #339900;">#include &lt;memory&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Test<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Trouble
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Trouble<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">auto_ptr</span><span style="color: #000080;">&lt;</span>Test<span style="color: #000080;">&gt;</span> Test_<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #339900;">#endif//TROUBLE_H</span></pre></div></div>

<p><strong>trouble.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;test.h&quot;</span>
&nbsp;
<span style="color: #339900;">#include &quot;trouble.h&quot;</span>
&nbsp;
Trouble<span style="color: #008080;">::</span><span style="color: #007788;">Trouble</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008080;">:</span> Test_<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">new</span> Test<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><strong>main.cpp</strong></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;trouble.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> 
<span style="color: #008000;">&#123;</span>
	Trouble trouble<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Итак, имеется два класса: Test и Trouble, причем в целях ускорения компиляции разработчик решил сделать предварительное объявление класса Test в trouble.h, но не написал деструктор для класса Trouble, а значит компилятор заботливо создаст деструктор сам. Когда он это сделает? Вообще компилятор не мечется по коду, а последовательно его анализирует. </p>
<p>Начнет он с функции main в main.cpp, определит, что создается объект trouble типа Trouble из trouble.h, обнаружит конструктор. </p>
<p>Далее он сделает вывод, что по выходу из main объект trouble должен быть удален, попытается найти деструктор, не найдет его и создаст его сам. </p>
<p>Что будет в этом деструкторе? Естественно удаление членов класса, то есть в данном случае std::auto_ptr&lt;Test&gt;, в деструкторе которого будет соответственно вызван оператор delete для указателя на Test. </p>
<p>Внимательно следим за руками! В данном месте компилятор еще ничего не знает о типе Test, поскольку еще не дошел до test.h и поэтому оператор delete будет применен к неполному типу, что вызовет неопределенное поведение. </p>
<p>Откомпилировав приведенный код и выполнив программу вы скорее всего на выводе получите только сообщение из конструктора, деструктор для Test вызван не будет!</p>
<p>Далее подробности и методы борьбы с данным явлением.</p>
<p><p style="text-align: right"><a href="http://www.devexp.ru/2010/03/use-of-undefined-type/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/03/use-of-undefined-type/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/03/use-of-undefined-type/#comments">3 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/03/use-of-undefined-type/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>О копировании объектов в C++</title>
		<link>http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/</link>
		<comments>http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 21:18:36 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/</guid>
		<description><![CDATA[Я регулярно сталкиваюсь с ошибками связанными с невнимательностью или незнанием механизма копирования объектов в C++. Поэтому первое правило:
Не копируйте!
Задайте себе вопрос, действительно ли класс должен поддерживать копирование? Скорее всего это не нужно как по соображениям эффективности (передавать объект по ссылке или указателю менее накладно, чем создавать его копию при передаче по значению), так и просто [...]]]></description>
			<content:encoded><![CDATA[<p>Я регулярно сталкиваюсь с ошибками связанными с невнимательностью или незнанием механизма копирования объектов в C++. Поэтому первое правило:</p>
<h2>Не копируйте!</h2>
<p>Задайте себе вопрос, действительно ли класс должен поддерживать копирование? Скорее всего это не нужно как по соображениям эффективности (передавать объект по ссылке или указателю менее накладно, чем создавать его копию при передаче по значению), так и просто исходя из здравого смысла – зачем две копии объекта, представляющего к примеру базу данных с пользователями или порт? Поэтому сделайте класс некопируемым. Для этого надо перенести объявления копирующего конструктора и оператора присваивания в защищенную секцию (определять их необязательно):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> Port
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Port<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">virtual</span> ~Port<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
	Port<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Port<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	Port<span style="color: #000040;">&amp;</span> operator<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> Port<span style="color: #000040;">&amp;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<p>В этом случае при попытке скопировать объект возникнет ошибка компиляции из-за недоступности либо конструктора копирования, либо оператора присваивания.</p>
<p>Но чтобы каждый раз не писать данный код и дать людям ясно понять чего вы хотите, унаследуйте класс от boost::noncopyable:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;boost/noncopyable.hpp&gt;</span>
&nbsp;
<span style="color: #0000ff;">class</span> Port
	<span style="color: #008080;">:</span> <span style="color: #0000ff;">private</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">noncopyable</span>
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	Port<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">virtual</span> ~Port<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: #008080;">;</span></pre></div></div>

<p>На этом можно остановиться, но если же вы решили, что класс должен поддерживать копирование, то читайте дальше.</p>
<p><p style="text-align: right"><a href="http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/#comments">8 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Архивирование с библиотеками zlib и bzip2/libbzip2 используя Boost Iostreams</title>
		<link>http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/</link>
		<comments>http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 19:59:18 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Boost]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/</guid>
		<description><![CDATA[Недавно у меня возникла задача добавить сжатие данных в программу. Сразу нашлось две свободных библиотеки – zlib и libbzip2 написанные на C. Изучив вопрос глубже, оказалось что писать удобные обертки над функциями на C не нужно, так как в Boost IOStreams все уже написано.
О том как добавить данный функционал и правильно собрать проект я расскажу [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно у меня возникла задача добавить сжатие данных в программу. Сразу нашлось две свободных библиотеки – <a href="http://zlib.net/" target="_blank">zlib</a> и <a href="http://www.bzip.org/" target="_blank">libbzip2</a> написанные на C. Изучив вопрос глубже, оказалось что писать удобные обертки над функциями на C не нужно, так как в <a href="http://www.boost.org/doc/libs/1_42_0/libs/iostreams/doc/index.html" target="_blank">Boost IOStreams</a> все уже написано.</p>
<p>О том как добавить данный функционал и правильно собрать проект я расскажу в данной заметке. Также будет приведен пример кода для сжатия и распаковки файлов и сравнение zlib (алгоритм <strong>DEFLATE</strong>, методы <strong>gzip</strong> и <strong>zlib</strong>) и libbzip2 (алгоритм <strong>bzip2</strong>) по скорости работы и уровню сжатия тестовых, бинарных и исполняемых файлов.</p>
<p> <p style="text-align: right"><a href="http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/#comments">Нет комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>,  <a href="http://www.devexp.ru/category/razrabotka/" title="Просмотреть все записи в Разработка" rel="category tag">Разработка</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/03/arxivirovanie-s-bibliotekami-zlib-i-bzip2libbzip2-ispolzuya-boost-iostreams/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Чтение настроек приложения</title>
		<link>http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/</link>
		<comments>http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 14:23:07 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Конфигурирование]]></category>
		<category><![CDATA[Разработка]]></category>
		<category><![CDATA[Boost]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/</guid>
		<description><![CDATA[Мне часто приходится писать гибко конфигурируемые программы. Конфигурационные файлы часто получаются довольно сложными, с развитой иерархией. Для хранения настроек я использовал XML файлы, а разбор конфигурации делал вручную.
Недавно (с версии 1.41.0) в Boost появилась библиотека Property Tree, предназначенная для решения данной задачи. Помимо поддержки XML, также поддерживаются форматы INI, JSON и свой формат INFO. 
В [...]]]></description>
			<content:encoded><![CDATA[<p>Мне часто приходится писать гибко конфигурируемые программы. Конфигурационные файлы часто получаются довольно сложными, с развитой иерархией. Для хранения настроек я использовал <strong>XML</strong> файлы, а разбор конфигурации делал вручную.</p>
<p>Недавно (с версии 1.41.0) в <strong>Boost</strong> появилась библиотека <a href="http://www.boost.org/doc/libs/1_42_0/libs/property_tree/index.html" target="_blank">Property Tree</a>, предназначенная для решения данной задачи. Помимо поддержки <strong>XML</strong>, также поддерживаются форматы <strong>INI</strong>, <strong>JSON</strong> и свой формат <strong>INFO</strong>. </p>
<p>В данной заметке я рассмотрю указанные форматы и приведу код для разбора файла.</p>
<p> <p style="text-align: right"><a href="http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/">Читать дальше...</a></p><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/#comments">6 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>,  <a href="http://www.devexp.ru/category/razrabotka/configuration/" title="Просмотреть все записи в Конфигурирование" rel="category tag">Конфигурирование</a>,  <a href="http://www.devexp.ru/category/razrabotka/" title="Просмотреть все записи в Разработка" rel="category tag">Разработка</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/02/chtenie-nastroek-prilozheniya/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Boost Optional</title>
		<link>http://www.devexp.ru/2010/02/boost-optional/</link>
		<comments>http://www.devexp.ru/2010/02/boost-optional/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 19:45:07 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Boost]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/02/boost-optional/</guid>
		<description><![CDATA[В C# при объявлении переменной можно приставить знак вопроса, после чего в дальнейшем проверять была ли переменная инициализирована или нет:

int? a;
...
if &#40;a.HasValue&#41;
&#123;
	...
&#125;

Иногда это бывает очень полезно, например при работе с базами данных.
В C++ к сожалению такого удобства нет, но как известно – программисты C++ отличаются верностью и если язык не предоставляет какую либо возможность, они [...]]]></description>
			<content:encoded><![CDATA[<p>В C# при объявлении переменной можно приставить знак вопроса, после чего в дальнейшем проверять была ли переменная инициализирована или нет:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span><span style="color: #008000;">?</span> a<span style="color: #008000;">;</span>
...
<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>a.<span style="color: #0000FF;">HasValue</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	...
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Иногда это бывает очень полезно, например при работе с базами данных.</p>
<p>В C++ к сожалению такого удобства нет, но как известно – программисты C++ отличаются верностью и если язык не предоставляет какую либо возможность, они ее добавляют сами. Например в <strong>Boost</strong> данный функционал присутствует:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;boost/optional.hpp&gt;</span>
...
<span style="color: #007788;">boost</span><span style="color: #008080;">::</span><span style="color: #007788;">optional</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> a<span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>a.<span style="color: #007788;">is_initialized</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;Есть значение&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;Нет значения&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
boost<span style="color: #008080;">::</span><span style="color: #007788;">optional</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> b<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>b <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;Есть значение&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;Нет значения&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
a <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>a <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;Есть значение&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;Нет значения&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> result <span style="color: #000080;">=</span> a.<span style="color: #007788;">get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> b.<span style="color: #007788;">get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> result <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
b.<span style="color: #007788;">reset</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span>b <span style="color: #008080;">?</span> <span style="color: #FF0000;">&quot;Есть значение&quot;</span> <span style="color: #008080;">:</span> <span style="color: #FF0000;">&quot;Нет значения&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span></pre></div></div>

<p>Вывод:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Нет значения
Есть значение
Есть значение
<span style="color: #000000;">8</span>
Нет значения</pre></div></div>

<img src="http://www.devexp.ru/?ak_action=api_record_view&id=66&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/02/boost-optional/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/02/boost-optional/#comments">Нет комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/02/boost-optional/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Освобождение памяти занятой контейнером</title>
		<link>http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/</link>
		<comments>http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 18:55:30 +0000</pubDate>
		<dc:creator>Максим Тремпольцев</dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false">http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/</guid>
		<description><![CDATA[На днях объяснял товарищу, что у std::vector метод clear(), хоть и удаляет свое содержимое, но вот выделенную память не возвращает. Например, после запуска следующей программы:

#include &#60;iostream&#62;
#include &#60;vector&#62;
&#160;
int main&#40;int argc, char* argv&#91;&#93;&#41;
&#123;
	std::vector&#60;int&#62; data;
	data.resize&#40;200000&#41;;
	std::cout &#60;&#60; data.capacity&#40;&#41; &#60;&#60; std::endl;
	data.clear&#40;&#41;;
	std::cout &#60;&#60; data.capacity&#40;&#41; &#60;&#60; std::endl;
	return 0;
&#125;

Будет выведено:

200000
200000

Почему не возвращает? Потому, что есть метод resize и reserve, которые резервируют память и [...]]]></description>
			<content:encoded><![CDATA[<p>На днях объяснял товарищу, что у std::vector метод clear(), хоть и удаляет свое содержимое, но вот выделенную память не возвращает. Например, после запуска следующей программы:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> data<span style="color: #008080;">;</span>
	data.<span style="color: #007788;">resize</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">200000</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> data.<span style="color: #007788;">capacity</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	data.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> data.<span style="color: #007788;">capacity</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Будет выведено:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000dd;">200000</span>
<span style="color: #0000dd;">200000</span></pre></div></div>

<p>Почему не возвращает? Потому, что есть метод resize и reserve, которые резервируют память и поэтому освободить память было бы крайне некорректно по отношению к ним. </p>
<p>Что же делать? Не паниковать, а после удаления содержимого использовать следующую идиому:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>.<span style="color: #007788;">swap</span><span style="color: #008000;">&#40;</span>data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Также может быть полезным освободить незанятую память, например после удаления доброй половины большого контейнера:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>data<span style="color: #008000;">&#41;</span>.<span style="color: #007788;">swap</span><span style="color: #008000;">&#40;</span>data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<img src="http://www.devexp.ru/?ak_action=api_record_view&id=58&type=feed" alt="" /><hr noshade style="margin:0;height:1px" />
<small>
<p>Copyright &copy; 2010, <a href="http://www.devexp.ru">Личный опыт разработки ПО</a>. 
Все права защищены. |
<a href="http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/">Постоянная ссылка</a> |
<a href="http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/#comments">2 комментариев</a>
<br/>
Хотите узнать больше? Посмотреть все записи в категории <a href="http://www.devexp.ru/category/c/" title="Просмотреть все записи в C++" rel="category tag">C++</a>.</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.devexp.ru/2010/01/osvobozhdenie-pamyati-zanyatoj-kontejnerom/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

