<?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>泛城科技技术博客c++ &#187; 泛城科技技术博客</title>
	<atom:link href="http://tech.lezi.com/archives/tag/c/feed" rel="self" type="application/rss+xml" />
	<link>http://tech.lezi.com</link>
	<description></description>
	<lastBuildDate>Fri, 04 Jan 2013 09:18:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>C++ Boost智能指针小测</title>
		<link>http://tech.lezi.com/archives/392</link>
		<comments>http://tech.lezi.com/archives/392#comments</comments>
		<pubDate>Tue, 24 Apr 2012 06:30:21 +0000</pubDate>
		<dc:creator>neilxp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://tech.lezi.com/?p=392</guid>
		<description><![CDATA[请阅读该文档(http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm)，回答以下问题： boost::shared_ptr能存放数组指针吗？如果不能，应该使用什么？ 与std::auto_ptr相比，boost::shared_ptr有什么优势？ 对于一般指针的dynamic_cast，boost::shared_ptr应该怎么cast？ 什么情况下使用shared_from_this? 如何获取shared_ptr中保存的具体对象的指针？ 如果要释放某shared_ptr对指针的引用，应该怎么操作？ 什么情况使用weak_ptr? shared_ptr怎么管理file, MYSQL_RES, CURL等资源？ 您也许会对以下文章感兴趣 C++程序注意事项 (评论：4) c++版本的普通程序员,文艺程序员,2b程序员和失足程序员 (评论：1)]]></description>
			<content:encoded><![CDATA[<p>请阅读该文档(<a href="http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm">http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm</a>)，回答以下问题：</p>
<ol>
<li>boost::shared_ptr能存放数组指针吗？如果不能，应该使用什么？</li>
<li>与std::auto_ptr相比，boost::shared_ptr有什么优势？</li>
<li>对于一般指针的dynamic_cast，boost::shared_ptr应该怎么cast？</li>
<li>什么情况下使用shared_from_this?</li>
<li>如何获取shared_ptr中保存的具体对象的指针？</li>
<li>如果要释放某shared_ptr对指针的引用，应该怎么操作？</li>
<li>什么情况使用weak_ptr?</li>
<li>shared_ptr怎么管理file, MYSQL_RES, CURL等资源？</li>
</ol>

	<h2>您也许会对以下文章感兴趣</h2>
	<ul class="st-related-posts">
	<li><a href="http://tech.lezi.com/archives/379" title="C++程序注意事项 (四月 5, 2012)">C++程序注意事项</a> (评论：4)</li>
	<li><a href="http://tech.lezi.com/archives/329" title="c++版本的普通程序员,文艺程序员,2b程序员和失足程序员 (十一月 12, 2011)">c++版本的普通程序员,文艺程序员,2b程序员和失足程序员</a> (评论：1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://tech.lezi.com/archives/392/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C++程序注意事项</title>
		<link>http://tech.lezi.com/archives/379</link>
		<comments>http://tech.lezi.com/archives/379#comments</comments>
		<pubDate>Thu, 05 Apr 2012 03:23:52 +0000</pubDate>
		<dc:creator>neilxp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://tech.lezi.com/?p=379</guid>
		<description><![CDATA[智能指针 为了避免 遗忘释放内存、资源 中途return，需要多处调用释放内存，资源 放到容器中的指针，错误释放内存，资源 我们写c++程序时，都使用智能指针来帮助管理内存和资源。c++不是c，提供的便捷要利用起来： 不使用任何明确的delete语句 熟悉并熟练使用 std::auto_ptr, boost::shared_ptr, boost::shared_array, boost::scoped_ptr, boost::scoped_array Don&#8217;t 动态分配内存，不要使用以下方法. 因为 1 处会抛出异常造成delete无法释放。 int n = 100; char *p = new char[n]; ....// 1: 使用p delete []p; Do 使用以下任一方法分配、管理内存 int n = 100; std::vector v; v.resize(n); ....// 使用 &#38;v.at(0)或者&#38;v[0], 与上面的p等价 // 不需要调用delete[] 或者 int n = 100; boost::shared_array p(new char[n]); [...]]]></description>
			<content:encoded><![CDATA[<h1>智能指针</h1>
<p>为了避免</p>
<ol>
<li>遗忘释放内存、资源</li>
<li>中途return，需要多处调用释放内存，资源</li>
<li>放到容器中的指针，错误释放内存，资源</li>
</ol>
<p>我们写c++程序时，都使用智能指针来帮助管理内存和资源。c++不是c，提供的便捷要利用起来：</p>
<h2>不使用任何明确的delete语句</h2>
<p>熟悉并熟练使用 std::auto_ptr, boost::shared_ptr, boost::shared_array, boost::scoped_ptr, boost::scoped_array</p>
<h3>Don&#8217;t</h3>
<p>动态分配内存，<strong>不要</strong>使用以下方法. 因为 1 处会抛出异常造成delete无法释放。</p>
<pre class="brush:cpp">int n = 100;
char *p = new char[n];
....// 1: 使用p
delete []p;</pre>
<h3>Do</h3>
<p>使用以下任一方法分配、管理内存</p>
<pre class="brush:cpp">int n = 100;
std::vector v;
v.resize(n);
....// 使用 &amp;v.at(0)或者&amp;v[0], 与上面的p等价
// 不需要调用delete[]</pre>
<p>或者</p>
<pre class="brush:cpp">int n = 100;
boost::shared_array p(new char[n]); // 或者使用boost::scoped_array
// 不需要调用delete[]</pre>
<h2>不要直接调用系统锁资源和解锁资源</h2>
<p>使用以下方法管理mutex</p>
<pre class="brush:cpp">void foo(const char* fileName)
{
  boost::unique_lock lock(gMutex);
  // 竞争区域的代码
  return;
}</pre>
<h2>不要直接调用close, fclose, mysql_close, mysql_free_result, curl_easy_cleanup这些方关闭文件、数据库等资源的方法</h2>
<h3>Don&#8217;t</h3>
<p>打开文件，关闭文件，<strong>不要</strong>使用以下方法. 因为 2 处会抛出异常造成fclose无法释放。</p>
<pre class="brush:cpp">FILE *file = fopen(filename, "rb");
// 2, 使用 file
fclose(file);</pre>
<h3>Do</h3>
<p>使用以下方法管理文件指针</p>
<pre class="brush:cpp">struct CFileCloser{
  void operator ()(FILE* file){
    if (file) fclose(file);
  }
};

void foo(const char* fileName)
{
  boost::shared_ptr backgroundFile(fopen(fileName, "rb"), CFileCloser());
}</pre>
<p>使用以下方法管理MYSQL_RES</p>
<pre class="brush:cpp">boost::shared_ptr
    resultSp(mysql_store_result(&amp;mysql_), mysql_free_result);

if (!resultSp) {
    LOG4CXX_ERROR(gLogger, "error in mysql connection: " &lt;&lt; mysql_error(&amp;mysql_));
    return false;
}

boost::uint64_t numRows = mysql_num_rows(resultSp.get());
MYSQL_ROW row = mysql_fetch_row(resultSp.get());</pre>
<p>使用以下方法管理CURL</p>
<pre class="brush:cpp">bool performUrl(const std::string url, std::string&amp; result)
{
        std::stringstream oss;

        CURL* curl = curl_easy_init();
        boost::shared_ptr  pointer(curl, curl_easy_cleanup);
        if(curl)
        {
                curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
                curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
                curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1);
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeData);
                curl_easy_setopt(curl, CURLOPT_WRITEDATA, &amp;oss);
                curl_easy_perform(curl);

                result = oss.str();
                return true;
        }
        return false;
}</pre>
<h1>换掉一些可能造成crash的不安全函数</h1>
<p>使用std::ostringstream或者snprintf代替sprintf</p>
<pre class="brush:cpp">
  std::ostringstream oss;
  oss << DaemonConfig::disconnectNotifyURL << "?id=" << playerId;
</pre>

	<h2>您也许会对以下文章感兴趣</h2>
	<ul class="st-related-posts">
	<li><a href="http://tech.lezi.com/archives/329" title="c++版本的普通程序员,文艺程序员,2b程序员和失足程序员 (十一月 12, 2011)">c++版本的普通程序员,文艺程序员,2b程序员和失足程序员</a> (评论：1)</li>
	<li><a href="http://tech.lezi.com/archives/392" title="C++ Boost智能指针小测 (四月 24, 2012)">C++ Boost智能指针小测</a> (评论：1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://tech.lezi.com/archives/379/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>c++版本的普通程序员,文艺程序员,2b程序员和失足程序员</title>
		<link>http://tech.lezi.com/archives/329</link>
		<comments>http://tech.lezi.com/archives/329#comments</comments>
		<pubDate>Sat, 12 Nov 2011 04:42:38 +0000</pubDate>
		<dc:creator>neilxp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://tech.lezi.com/?p=329</guid>
		<description><![CDATA[逆序输出字符串 普通程序员 #include &#60;iostream&#62; using namespace std; char *str = "n!dlrow olleh"; int main (int argc, char** argv) { for(char *p = str + strlen(str); p &#62;= str; p--){ cout &#60;&#60; *p; } return 0; } 文艺程序员 #include &#60;iostream&#62; #include &#60;iterator&#62; #include &#60;algorithm&#62; using namespace std; static char *str = "n!dlrow olleh"; int main (int [...]]]></description>
			<content:encoded><![CDATA[<p>逆序输出字符串</p>
<p>普通程序员</p>
<pre class="brush:c">#include &lt;iostream&gt;
using namespace std;
char *str = "n!dlrow olleh";

int main (int argc, char** argv) {
  for(char *p = str + strlen(str); p &gt;= str; p--){
    cout &lt;&lt; *p;
  }
  return 0;
}</pre>
<p>文艺程序员</p>
<pre class="brush:c">#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

using namespace std;

static char *str = "n!dlrow olleh";

int main (int argc, char** argv) {
  reverse_copy(str, str + strlen(str) + 1, 
    ostream_iterator&lt;char&gt;(cout, ""));
  return EXIT_SUCCESS;
}</pre>
<p>2B程序员</p>
<pre class="brush:c">#include &lt;iostream.h&gt;

static char *str = "n!dlrow olleh";

int main () {
  char *p = str + strlen(str);
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
  putchar(*(p--));
}</pre>
<p>失足程序员</p>
<pre class="brush:c">#include &lt;iostream&gt;
using namespace std;

const char str[] = "n!dlrow olleh";

template&lt; int N &gt;
struct Printer{
    void operator()(){
        cout &lt;&lt; *(str + N);
    }
};

template&lt; template &lt; int &gt; class C, int N &gt;
struct Rev{
    Rev(){
        C&lt; N &gt;()();
        Rev&lt; C, N - 1&gt;();
    }
};

template&lt; template &lt; int &gt; class C &gt;
struct Rev&lt;C, 0&gt;{
    Rev(){
        C&lt; 0 &gt;()();
    }
};

template &lt;int N&gt;
int len_trait(const char (&amp;)[N])
{
    static Rev&lt; Printer, N &gt; rev;
    return 0;
}

static int dummy = len_trait(str);

int main(int argc, char** argv)
{
    return EXIT_SUCCESS;
}</pre>

	<h2>您也许会对以下文章感兴趣</h2>
	<ul class="st-related-posts">
	<li><a href="http://tech.lezi.com/archives/379" title="C++程序注意事项 (四月 5, 2012)">C++程序注意事项</a> (评论：4)</li>
	<li><a href="http://tech.lezi.com/archives/392" title="C++ Boost智能指针小测 (四月 24, 2012)">C++ Boost智能指针小测</a> (评论：1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://tech.lezi.com/archives/329/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
