﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-~怪^_*兽~-随笔分类-操作系统</title><link>http://cppblog.com/ldcsaa/category/19107.html</link><description>虚荣锁身躯 心灵给酒醉 脆弱人类 懒问何为对
&lt;br&gt;&lt;font color="#CC0000"&gt;（怪兽乐园Q群：&lt;a target="_blank" href="http://jq.qq.com/?_wv=1027&amp;k=28lgXyB"&gt;&lt;strong&gt;75375912&lt;/strong&gt;&lt;/a&gt;）&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 18 Jul 2017 06:22:37 GMT</lastBuildDate><pubDate>Tue, 18 Jul 2017 06:22:37 GMT</pubDate><ttl>60</ttl><item><title>高性能 TCP &amp; HTTP 通信框架 HP-Socket v4.3.1</title><link>http://www.cppblog.com/ldcsaa/archive/2017/07/17/215112.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Mon, 17 Jul 2017 02:03:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2017/07/17/215112.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/215112.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2017/07/17/215112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/215112.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/215112.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架，包含服务端组件、客户端组件和 Agent 组件，广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统，提供 C/C++、C#、Delphi、E（易语言）、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装，应用程序不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到新旧应用程序中。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2017/07/17/215112.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/215112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2017-07-17 10:03 <a href="http://www.cppblog.com/ldcsaa/archive/2017/07/17/215112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.3</title><link>http://www.cppblog.com/ldcsaa/archive/2017/01/18/214607.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Wed, 18 Jan 2017 06:24:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2017/01/18/214607.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/214607.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2017/01/18/214607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/214607.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/214607.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架，包含服务端组件、客户端组件和 Agent 组件，广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统，提供 C/C++、C#、Delphi、E（易语言）、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装，应用程序不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到新旧应用程序中。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2017/01/18/214607.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/214607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2017-01-18 14:24 <a href="http://www.cppblog.com/ldcsaa/archive/2017/01/18/214607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 TCP &amp; UDP 通信框架 HP-Socket v4.1.2</title><link>http://www.cppblog.com/ldcsaa/archive/2016/12/27/214560.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Tue, 27 Dec 2016 11:21:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2016/12/27/214560.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/214560.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2016/12/27/214560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/214560.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/214560.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架，包含服务端组件、客户端组件和 Agent 组件，广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统，提供 C/C++、C#、Delphi、E（易语言）、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装，应用程序不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到新旧应用程序中。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2016/12/27/214560.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/214560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2016-12-27 19:21 <a href="http://www.cppblog.com/ldcsaa/archive/2016/12/27/214560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 TCP &amp; UDP 通信框架 HP-Socket v3.3.1 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2015/02/03/209711.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Mon, 02 Feb 2015 19:07:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2015/02/03/209711.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/209711.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2015/02/03/209711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/209711.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/209711.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 TCP/UDP 通信框架，包含服务端组件、客户端组件和 Agent 组件，广泛适用于各种不同应用场景的 TCP/UDP 通信系统，提供 C/C++、C#、Delphi、E（易语言）、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装，应用程序不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到新旧应用程序中。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2015/02/03/209711.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/209711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2015-02-03 03:07 <a href="http://www.cppblog.com/ldcsaa/archive/2015/02/03/209711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 TCP &amp; UDP 通信框架 HP-Socket v3.2.3 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2014/08/13/207991.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Wed, 13 Aug 2014 05:50:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2014/08/13/207991.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/207991.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2014/08/13/207991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/207991.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/207991.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 TCP/UDP 通信框架，包含服务端组件、客户端组件和 Agent 组件，广泛适用于各种不同应用场景的 TCP/UDP 通信系统，提供 C/C++、C#、Delphi、E（易语言）、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装，应用程序不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到新旧应用程序中。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2014/08/13/207991.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/207991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2014-08-13 13:50 <a href="http://www.cppblog.com/ldcsaa/archive/2014/08/13/207991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 TCP &amp; UDP 通信框架 HP-Socket v3.2.2 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2014/07/08/207580.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Tue, 08 Jul 2014 14:33:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2014/07/08/207580.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/207580.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2014/07/08/207580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/207580.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/207580.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 TCP/UDP 通信框架，包含服务端组件、客户端组件和 Agent 组件，广泛适用于各种不同应用场景的 TCP/UDP 通信系统，提供 C/C++、C#、Delphi、E（易语言）、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装，应用程序不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到新旧应用程序中。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2014/07/08/207580.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/207580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2014-07-08 22:33 <a href="http://www.cppblog.com/ldcsaa/archive/2014/07/08/207580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 Socket 组件 HP-Socket v3.2.1 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2014/06/05/207196.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Thu, 05 Jun 2014 03:30:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2014/06/05/207196.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/207196.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2014/06/05/207196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/207196.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/207196.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 TCP/UDP Socket 组件，包含服务端组件、客户端组件和 Agent 组件，广泛适用于各种不同应用场景的 TCP/UDP 通信系统，提供 C/C++、C#、Delphi、E（易语言）、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到新旧应用程序中。为了让使用者能方便快速地学习和使用 HP-Socket，迅速掌握组件的设计思想和使用方法，特此精心制作了大量 Demo 示例，包括 PUSH 模型示例、PULL模型示例和性能测试示例等。HP-Socket 目前运行在 Windows 平台，将来会实现跨平台支持。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2014/06/05/207196.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/207196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2014-06-05 11:30 <a href="http://www.cppblog.com/ldcsaa/archive/2014/06/05/207196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 Socket 组件 HP-Socket v3.1.3 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2014/03/31/206403.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Mon, 31 Mar 2014 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2014/03/31/206403.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/206403.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2014/03/31/206403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/206403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/206403.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件，提供服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了功能测试示例（Test Echo）、性能测试示例（Test Echo-PFM）、PULL 模型测试示例（Test Echo-Pull） 和 UDP 测试示例（Test Echo-UDP），用户可以通过这几个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2014/03/31/206403.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/206403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2014-03-31 11:03 <a href="http://www.cppblog.com/ldcsaa/archive/2014/03/31/206403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【新年呈献】高性能 Socket 组件 HP-Socket v3.1.2 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2014/01/14/205332.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Tue, 14 Jan 2014 15:23:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2014/01/14/205332.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/205332.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2014/01/14/205332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/205332.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/205332.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件包，包含服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了功能测试示例（Test Echo）、性能测试示例（Test Echo-PFM）、PULL 模型测试示例（Test Echo-Pull） 和 UDP 测试示例（Test Echo-UDP），用户可以通过这几个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2014/01/14/205332.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/205332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2014-01-14 23:23 <a href="http://www.cppblog.com/ldcsaa/archive/2014/01/14/205332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【圣诞呈献】高性能 Socket 组件 HP-Socket v3.1.1 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2013/12/25/205004.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Wed, 25 Dec 2013 03:28:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/12/25/205004.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/205004.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/12/25/205004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/205004.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/205004.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件包，包含服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了功能测试示例（Test Echo）、性能测试示例（Test Echo-PFM）、PULL 模型测试示例（Test Echo-Pull） 和 UDP 测试示例（Test Echo-UDP），用户可以通过这几个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/12/25/205004.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/205004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-12-25 11:28 <a href="http://www.cppblog.com/ldcsaa/archive/2013/12/25/205004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更新整理本人所有博文中提供的代码与工具（C++，2013.12）</title><link>http://www.cppblog.com/ldcsaa/archive/2013/11/27/204469.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Wed, 27 Nov 2013 04:42:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/11/27/204469.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/204469.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/11/27/204469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/204469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/204469.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为了更方便地管理博文中涉及的各种代码与工具资源，现在把这些资源迁移到 Google Code 中。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/11/27/204469.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/204469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-11-27 12:42 <a href="http://www.cppblog.com/ldcsaa/archive/2013/11/27/204469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2013/11/26/204460.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Tue, 26 Nov 2013 08:43:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/11/26/204460.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/204460.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/11/26/204460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/204460.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/204460.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件包，包含服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了功能测试示例（Test Echo）、性能测试示例（Test Echo-PFM）、PULL 模型测试示例（Test Echo-Pull） 和 UDP 测试示例（Test Echo-UDP），用户可以通过这几个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/11/26/204460.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/204460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-11-26 16:43 <a href="http://www.cppblog.com/ldcsaa/archive/2013/11/26/204460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 Windows Socket 组件 HP-Socket v3.0.1 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2013/10/29/203957.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Mon, 28 Oct 2013 18:35:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/10/29/203957.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/203957.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/10/29/203957.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/203957.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/203957.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件包，包含服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了功能测试示例（Test Echo）性能测试示例（Test Echo-PFM）PULL 模型测试示例（Test Echo-Pull） 和 UDP 测试示例（Test Echo-UDP），用户可以通过这几个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/10/29/203957.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/203957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-10-29 02:35 <a href="http://www.cppblog.com/ldcsaa/archive/2013/10/29/203957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布</title><link>http://www.cppblog.com/ldcsaa/archive/2013/10/24/203900.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Thu, 24 Oct 2013 06:11:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/10/24/203900.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/203900.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/10/24/203900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/203900.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/203900.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件包，包含服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP/UDP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了功能测试示例（Test Echo）性能测试示例（Test Echo-PFM）PULL 模型测试示例（Test Echo-Pull） 和 UDP 测试示例（Test Echo-UDP），用户可以通过这几个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/10/24/203900.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/203900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-10-24 14:11 <a href="http://www.cppblog.com/ldcsaa/archive/2013/10/24/203900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更新整理本人所有博文中提供的代码与工具（C++，2013.10）</title><link>http://www.cppblog.com/ldcsaa/archive/2013/10/11/203643.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Thu, 10 Oct 2013 16:26:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/10/11/203643.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/203643.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/10/11/203643.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/203643.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/203643.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为了更方便地管理博文中涉及的各种代码与工具资源，现在把这些资源迁移到 Google Code 中，有兴趣者可前往下载。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/10/11/203643.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/203643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-10-11 00:26 <a href="http://www.cppblog.com/ldcsaa/archive/2013/10/11/203643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 Windows Socket 组件 HP-Socket v2.2.3 正式发布</title><link>http://www.cppblog.com/ldcsaa/archive/2013/08/25/202759.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Sun, 25 Aug 2013 14:19:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/08/25/202759.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/202759.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/08/25/202759.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/202759.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/202759.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件包，包含服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了一个功能测试示例（Test Echo）一个性能测试示例（Test Echo-PFM）和一个 PULL 模型测试示例（Test Echo-Pull），用户可以通过这两个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/08/25/202759.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/202759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-08-25 22:19 <a href="http://www.cppblog.com/ldcsaa/archive/2013/08/25/202759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更新整理本人所有博文中提供的代码与工具（C++，2013.08）</title><link>http://www.cppblog.com/ldcsaa/archive/2013/08/18/202614.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Sun, 18 Aug 2013 15:57:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/08/18/202614.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/202614.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/08/18/202614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/202614.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/202614.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为了更方便地管理博文中涉及的各种代码与工具资源，现在把这些资源迁移到 Google Code 中，有兴趣者可前往下载。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/08/18/202614.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/202614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-08-18 23:57 <a href="http://www.cppblog.com/ldcsaa/archive/2013/08/18/202614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通用高性能 Windows Socket 组件 HP-Socket v2.2.2 更新发布</title><link>http://www.cppblog.com/ldcsaa/archive/2013/07/11/201697.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Thu, 11 Jul 2013 14:49:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/07/11/201697.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/201697.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/07/11/201697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/201697.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/201697.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件包，包含服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了一个功能测试示例（Test Echo）一个性能测试示例（Test Echo-PFM）和一个 PULL 模型测试示例（Test Echo-Pull），用户可以通过这两个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/07/11/201697.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/201697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-07-11 22:49 <a href="http://www.cppblog.com/ldcsaa/archive/2013/07/11/201697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【端午呈献】通用高性能 Windows Socket 组件 HP-Socket v2.2.1 悄然发布</title><link>http://www.cppblog.com/ldcsaa/archive/2013/06/13/200960.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Wed, 12 Jun 2013 19:11:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/06/13/200960.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/200960.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/06/13/200960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/200960.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/200960.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: HP-Socket 是一套通用的高性能 Windows Socket 组件包，包含服务端组件（IOCP 模型）和客户端组件（Event Select 模型），广泛适用于 Windows 平台的 TCP 通信系统。HP-Socket 对通信层实现完全封装，上层应用不必关注通信层的任何细节；HP-Socket 提供基于事件通知模型的 API 接口，能非常简单高效地整合到各类应用程序中；另外，为了让大家能更方便的学习 HP-Socket，特此精心制作了一个功能测试示例（Test Echo）一个性能测试示例（Test Echo-PFM）和一个 PULL 模型测试示例（Test Echo-Pull），用户可以通过这两个测试示例入手，迅速掌握组件的设计思想和使用方法。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/06/13/200960.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/200960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-06-13 03:11 <a href="http://www.cppblog.com/ldcsaa/archive/2013/06/13/200960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【技术分享】发布本人所属 Java 与 C++ 开源项目</title><link>http://www.cppblog.com/ldcsaa/archive/2013/05/21/200420.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Mon, 20 May 2013 17:28:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/05/21/200420.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/200420.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/05/21/200420.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/200420.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/200420.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: *** Java ***<br>1、Java 全能高效 MVC & REST 开发框架 Portal-Basic<br>2、Java 日志切割清理工具 Log-Cutter<br><br>*** C++ ***<br>1、通用高性能 Windows Socket 组件 HP-Socket<br>2、Windows C++ 应用程序通用日志组件 VC-Logger&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/05/21/200420.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/200420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-05-21 01:28 <a href="http://www.cppblog.com/ldcsaa/archive/2013/05/21/200420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【★更新★】整理发布本人所有博文中提供的代码与工具（C++）</title><link>http://www.cppblog.com/ldcsaa/archive/2013/05/08/200091.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Tue, 07 May 2013 18:02:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/05/08/200091.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/200091.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/05/08/200091.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/200091.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/200091.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为了更方便地管理博文中涉及的各种代码与工具资源，现在把这些资源迁移到 Google Code 中，有兴趣者可前往下载。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/05/08/200091.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/200091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-05-08 02:02 <a href="http://www.cppblog.com/ldcsaa/archive/2013/05/08/200091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【★更新★】高性能 Windows Socket 组件 HP-Socket v2.1.1 正式发布（源代码及测试用例下载）</title><link>http://www.cppblog.com/ldcsaa/archive/2013/04/22/199617.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Sun, 21 Apr 2013 17:55:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/04/22/199617.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/199617.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/04/22/199617.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/199617.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/199617.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 自从本座发表了两篇关于 Windows Socket 通信组件实现的文章后，收到不少读者的留言，希望能分享完整的源代码。此时，本座不敢弊帚自珍。特意在此提供服务端组件和客户端组件的完整代码。另外，为便于读者学习和理解，花了一点点时间精心制作了两个测试用例，一个用于功能测试（TestEcho），另一个用于性能测试（TestEcho-PFM）。读者可以通过这两个测试用例入手，迅速掌握组件的使用方法。希望对大家有所帮助，谢谢 ~ ^_^ ~&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/04/22/199617.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/199617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-04-22 01:55 <a href="http://www.cppblog.com/ldcsaa/archive/2013/04/22/199617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 Windows Socket 服务端与客户端组件（HP-Socket v2.1.1 即将发布）</title><link>http://www.cppblog.com/ldcsaa/archive/2013/04/15/199410.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Mon, 15 Apr 2013 00:18:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/04/15/199410.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/199410.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/04/15/199410.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/199410.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/199410.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 自从本座发表了两篇关于 Windows Socket 通信组件实现的文章后，收到不少读者的留言，希望能分享完整的源代码。此时，本座不敢弊帚自珍。特意在此提供服务端组件和客户端组件的完整代码。另外，为便于读者学习和理解，花了一点点时间精心制作了两个测试用例，一个用于功能测试（TestEcho），另一个用于性能测试（TestEcho-PFM）。读者可以通过这两个测试用例入手，迅速掌握组件的使用方法。希望对大家有所帮助，谢谢 ~ ^_^ ~&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/04/15/199410.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/199410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-04-15 08:18 <a href="http://www.cppblog.com/ldcsaa/archive/2013/04/15/199410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【★更新★】发布本人所有博客文章中涉及的代码与工具（大部分是C++和Java）</title><link>http://www.cppblog.com/ldcsaa/archive/2013/03/29/198918.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Fri, 29 Mar 2013 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/03/29/198918.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/198918.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/03/29/198918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/198918.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/198918.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 为了更方便地管理博文中涉及的各种代码与工具资源，现在把这些资源迁移到 Google Code 中，有兴趣者可前往下载。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/03/29/198918.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/198918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-03-29 11:17 <a href="http://www.cppblog.com/ldcsaa/archive/2013/03/29/198918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【★更新★】高性能 Windows Socket 服务端与客户端组件（源代码及测试用例下载 v2.0.1）</title><link>http://www.cppblog.com/ldcsaa/archive/2013/03/25/198742.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Sun, 24 Mar 2013 18:59:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/03/25/198742.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/198742.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/03/25/198742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/198742.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/198742.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 自从本座发表了两篇关于 Windows Socket 通信组件实现的文章后，收到不少读者的留言，希望能分享完整的源代码。此时，本座不敢弊帚自珍。特意在此提供服务端组件和客户端组件的完整代码。另外，为便于读者学习和理解，花了一点点时间精心制作了两个测试用例，一个用于功能测试（TestEcho），另一个用于性能测试（TestEcho-PFM）。读者可以通过这两个测试用例入手，迅速掌握组件的使用方法。希望对大家有所帮助，谢谢 ~ ^_^ ~&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/03/25/198742.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/198742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-03-25 02:59 <a href="http://www.cppblog.com/ldcsaa/archive/2013/03/25/198742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何养成良好的 C++ 编程习惯（一）—— 内存管理</title><link>http://www.cppblog.com/ldcsaa/archive/2013/03/20/198603.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Tue, 19 Mar 2013 17:27:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2013/03/20/198603.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/198603.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2013/03/20/198603.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/198603.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/198603.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: “养成良好的编程习惯”其实是相当综合的一个命题，可以从多个角度、维度和层次进行论述和评判。如代码的风格、效率和可读性；模块设计的灵活性、可扩展性和耦合度等等。要试图把所有方面都阐述清楚必须花很多的精力，而且也不一定能阐述得全面。因此，本系列文章以软件开发的基础问题为切入点，阐述程序设计和代码编写方面的细节问题，以点带面，旨在激发大家的思考与总结，希望能为大家带来实际的帮助。<br>    虽然本系列文章定位为科普读物，但本座相信它们不但适合新手们学习借鉴，同时也能引发老鸟们的反思与共鸣。欢迎大家提出宝贵的意见和反馈。&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2013/03/20/198603.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/198603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2013-03-20 01:27 <a href="http://www.cppblog.com/ldcsaa/archive/2013/03/20/198603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows C++ 应用程序通用日志组件（组件及测试程序下载）</title><link>http://www.cppblog.com/ldcsaa/archive/2012/07/02/181117.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Mon, 02 Jul 2012 02:46:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2012/07/02/181117.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/181117.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2012/07/02/181117.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/181117.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/181117.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 主要功能<br>a) 把日志信息输出到指定文件<br>b) 每日生成一个日志文件<br>c) 对于 GUI 程序，可以把日志信息发送到指定窗口<br>d) 对于Console应用程序，可以把日志信息发往标准输出 (std::cout)<br>e) 支持 MBCS / UNICODE，Console / GUI 程序<br>f) 支持动态加载和静态加载日志组件 DLL<br>g) 支持 DEBUG/TRACE/INFO/WARN/ERROR/FATAL 等多个日志级别&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2012/07/02/181117.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/181117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2012-07-02 10:46 <a href="http://www.cppblog.com/ldcsaa/archive/2012/07/02/181117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高性能 Windows Socket 服务端与客户端组件（源代码及测试用例下载）</title><link>http://www.cppblog.com/ldcsaa/archive/2012/06/15/178763.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Fri, 15 Jun 2012 01:40:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2012/06/15/178763.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/178763.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2012/06/15/178763.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/178763.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/178763.html</trackback:ping><description><![CDATA[<p>　　自从本座发表了两篇关于 Windows Socket 通信组件实现的文章后，收到不少读者的留言，希望能分享完整的源代码。此时，本座不敢弊帚自珍。特意在此提供服务端组件和客户端组件的完整代码。另外，为便于读者学习和理解，花了一点点时间精心制作了两个测试用例，一个用于功能测试（TestEcho），另一个用于性能测试（TestEcho-PFM）。读者可以通过这两个测试用例入手，迅速掌握组件的使用方法。希望对大家有所帮助，谢谢 ~ ^_^ ~</p>
<p>&nbsp;</p>
<p>　　（<a href="http://files.cnblogs.com/ldcsaa/socket_server_%26_client.zip" data-mce-href="http://files.cnblogs.com/ldcsaa/socket_server_%26_client.zip">轻踩这里，你懂的 ^_*</a>）</p>
<p>&nbsp;</p>
<hr />

<p>&nbsp;</p>
<p><em><strong><span style="font-size: 14pt" data-mce-style="font-size: 14pt;">原文：《<a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/26/2367409.html" data-mce-href="http://www.cnblogs.com/ldcsaa/archive/2012/02/26/2367409.html">基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现</a></span></strong></em><em><strong><span style="font-size: 14pt" data-mce-style="font-size: 14pt;">》</span></strong></em></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt" data-mce-style="font-size: 18pt;"><strong>设计概述</strong></span></p>
<p>　　服务端通信组件的设计是一项非常严谨的工作，其中性能、伸缩性和稳定性是必须考虑的硬性质量指标，若要把组件设计为通用组件提供给多种已知或未知的上层应用使用，则设计的难度更会大大增加，通用性、可用性和灵活性必须考虑在内。</p>
<p>　　现以一个基于 IOCP 的通用异步 Windows Socket TCP 服务端组件为例子，讲述其设计与实现相关的问题，希望能引发大家的思考，对大家日后开展相关类似工作时有所帮助。关于通用性、可用性、Socket 模型选型以及接口模型的设计等问题已经在本座前段时间发表的《<strong><a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html" target="_blank" data-mce-href="http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html">通用异步 Windows Socket TCP 客户端组件的设计与实现</a></strong>》中进行过阐述，此处就不再重复了。现在主要针对服务端通信组件的特点阐述设计其设计和实现相关的问题。</p>
<p>&nbsp;</p>
<p>　　<strong>一、线程结构</strong></p>
<p>　　与组件相关的线程有 3 种：使用者线程、Accept&nbsp; 线程和工作线程，其中后 2 种由组件实现。</p>
<ol><li style="list-style-type: none" data-mce-style="list-style-type: none;">
<ol><li><strong>使用者线程：</strong>通过调用 Start/Stop/Send 等组件方法操作组件的一个或多个线程，通常是程序的主线程或其它业务逻辑线程。</li><li><strong>Accept 线程：</strong>使用 AcceptEx() 接收客户端连接请求并创建 Client Socket 的线程，将其独立出来，实现为单独的线程将使组件的模块划分更清晰，更重要的是避免与业务逻辑和通信处理的相互影响。</li><li><strong>工作线程：</strong>使用 GetQueuedCompletionStatus() 监听网络事件并处理网络交互的多个线程，工作线程处理完网络事件后会向上层应用发送 OnAccept/OnSend/OnReceive 等组件通知。工作线程的数量可以根据实际情况之行设置（通常建议为：CPU&nbsp;Core Number&nbsp;* 2 + 2）。 </li></ol></li></ol>
<p>　　<strong>注意：</strong>如果上层应用在接收到 OnAccept/OnSend/OnReceive 这些组件通知时直接进行业务逻辑处理并在其中操作组件，则工作线程也成为了使用者线程。另外，如果要处理的业务逻辑比较耗时，上层应用应该在接收到组件通知后交由其他线程处理。</p>
<p>&nbsp;</p>
<p>　　<strong>二、性能</strong></p>
<p>　　组件采用 Windows 平台效率最高的&nbsp;IOCP Socket 通信模型，因此在通信接口的性能方面是有保证的，这里就不多说了。现在从组件的设计与实现的角度来来阐述性能的优化。组件在代码级别做了很多优化，一些看似多余或繁琐的代码其实都是为了性能服务；组件在设计方面主要采用了 2 中优化策略：缓存池和私有堆。</p>
<ol>
<ol><li><strong>缓存池：</strong>在通信的过程中，通常需要频繁的申请和释放内存缓冲区（TBufferObj）和 Socket 相关的结构体（TSocketObj），这会大大影响组件的性能，因此，组件为 TBufferObj 和 TSocketObj 建立了动态缓存池， 只有当缓存池中没有可用对象时才创建新对象，而当缓存对象过多时则会压缩缓存池。</li><li><strong>私有堆（Private Heap）：</strong>在操作系统中，new / malloc 等操作是串行化的，虽然一般的应用程序不用太在乎这个问题，但是在一个高并发的服务器中则是个不可忽略的问题，另外 TBufferObj 和 TSocketObj 均为大小固定的结构体，因此非常适合在私有堆中分配内存，避免与 new / malloc 竞争同时又减少内存空洞。（<a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/12/2348302.html" target="_blank" data-mce-href="http://www.cnblogs.com/ldcsaa/archive/2012/02/12/2348302.html">关于私有堆的使用方法请参考这里 ^_^</a>） </li></ol></ol>
<p>&nbsp;　　</p>
<p>　　<strong>三、通用性与可用性</strong></p>
<p>　　与《<strong><a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html" target="_blank" data-mce-href="http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html">通用异步 Windows Socket TCP 客户端组件的设计与实现</a></strong>》描述的客户端接口一样，服务端组件也提供了两组接口：ISocketServer 接口提供组件操作方法，由上层应用直接调用；IServerSocketListener 接口提供组件通知方法，由上层应用实现，这两个接口设计得非常简单，主要方法均不超过 5 个。由于组件自身功能完备（不需要附带其它库或代码）并且职责单一（只管通信，不参与业务逻辑），因此可以十分方便第整合到任何类型的应用程序中。</p>
<p>&nbsp;</p>
<p>　　<strong>四、伸缩性</strong></p>
<p>　　可以根据实际的使用环境要求设置工作线程的数量、 TBufferObj 和 TSocketObj 缓存池的大小、TBufferObj 缓冲区的大小、Socket 监听队列的大小、AccepEx 派发的数目以及心跳检查的间隔等。</p>
<p>&nbsp;</p>
<p>　　<strong>五、连接标识</strong></p>
<p>　　组件完全封装了所有的底层 Socket 通信，上层应用看不到任何通信细节，不必也不能干预任何通信操作。另外，组件在 IServerSocketListener 通知接口的所有方法中都有一个 Connection ID 参数，该参数作为连接标识提供给上层应用识别不同的连接。</p>
<p>&nbsp;</p>
<hr />

<p>&nbsp;</p>
<p><em><strong><span style="font-size: 14pt" data-mce-style="font-size: 14pt;">原文：《<a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html" data-mce-href="http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html">通用异步 Windows Socket TCP 客户端组件的设计与实现</a></span></strong></em><em><strong><span style="font-size: 14pt" data-mce-style="font-size: 14pt;">》</span></strong></em></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt" data-mce-style="font-size: 18pt;"><strong>设计概述</strong></span></p>
<p>　　编写 Windows Socket TCP 客户端其实并不困难，Windows 提供了6种&nbsp;I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起，剪不断理还乱。每个程序都 Copy / Parse 类似的代码再进行修改，实在有点情何以堪。因此本座利用一些闲暇时光写了一个<strong><a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/25/2367409.html" target="_blank" data-mce-href="http://www.cnblogs.com/ldcsaa/archive/2012/02/25/2367409.html">基于 IOCP 的通用异步 Windows Socket TCP&nbsp;高性能服务端组件</a></strong>和一个<strong>通用异步 Windows Socket TCP 客户端组件</strong>供各位看官参详参详，希望能激发下大家的灵感。本篇文章讲述客户端组件。闲话少说，我们现在步入正题。</p>
<ul><li>最重要的第一个问题：如何才能达到通用？ </li></ul>
<p>　　答：很简单。</p>
<p>　　　　1、限制组件的职能，说白了，<span style="color: #0000ff" data-mce-style="color: #0000ff;">通信组件的唯一职责就是接受和发送字节流</span>，绝对不能参与上层协议解析等工作。不在其位不谋其政就是这个意思。</p>
<p>　　　　2、与上层使用者解耦、互不依赖，组件与使用者通过接口方法进行交互，组件实现 ISocketClient 接口为上层提供操作方法；使用者通过&nbsp;IClientSocketListener 接口把自己注册为组件的 Listener，接收组件通知。因此，任何使用者只要实现了 IClientSocketListener 接口都可以使用组件；另一方面，你甚至可以自己重新写一个实现方式完全不同的组件实现给使用者调用，只要该组件遵从 ISocketClient 接口。这也是 DIP 设计原则的体现（<a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/26/2368959.html" target="_blank" data-mce-href="http://www.cnblogs.com/ldcsaa/archive/2012/02/26/2368959.html">若想了解更多关于设计原则的内容请猛击这里 ^_^</a>）。</p>
<p>&nbsp;</p>
<ul><li>最重要的第二个问题：可用性如何，也就是说使用起来是否是否方便？ </li></ul>
<p>　　答：这个问题问得很好，可用性对所有通用组件都是至关重要的，如果太难用还不如自己重头写一个来得方便。因此，ISocketClient 和 IClientSocketListener 接口设计得尽量简单易用（通俗来说就是&#8220;傻瓜化&#8221;），这两个接口的主要方法均不超过 5 个。</p>
<p>&nbsp;</p>
<ul><li>最重要的第三个问题：组件的性能如何？ </li></ul>
<p>　　作为底层的通用组件，性能问题是必须考虑的，绝对不能成为系统的瓶颈。而另一方面，从实际出发，毕竟只是一个客户端组件，它的并发性要求远没有服务端那么高。因此，组件在设计上充分考虑了性能、现实使用情景、可用性和实现复杂性等因素，确保满足性能要求的同时又不会写得太复杂。做出以下两点设计决策：</p>
<ol>
<ol><li>在单独线程中实现 Socket 通信交互。这样可以避免与主线程或其他线程相互干扰。</li><li>I/O&nbsp;模型选择 WSAEventSelect。细说一下选择这种 I/O 模型的原因：（各种 I/O 模型的性能比较可以参考：《Windows 网络编程（中文第二版）》第 154 页） 
<ul><li>阻塞模型：（不解析，你懂的^_^）</li><li>非阻塞模型：（性能太低）</li><li>WSAAsyncSelect：&nbsp;（两个原因：a、性能太低；b、对于纯 Console 程序还要背负 HWND 实在是伤不起呀！）</li><li>重叠 I/O：（有点复杂了）</li><li>完成端口：（何必呢？） </li></ul></li></ol></ol>
<hr />

<p>&nbsp;<strong style="color: #800000">原文出处：</strong><a href="http://www.cnblogs.com/ldcsaa" target="_blank"><strong>怪兽的博客</strong></a><strong>&nbsp;&nbsp;</strong><a href="http://weibo.com/u/1402935851" target="_blank"><strong>怪兽的微博</strong></a><strong>&nbsp;&nbsp;</strong><a href="http://qun.qq.com/#jointhegroup/gid/75375912" target="_blank"><strong>怪兽乐园Q群</strong></a></p><img src ="http://www.cppblog.com/ldcsaa/aggbug/178763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2012-06-15 09:40 <a href="http://www.cppblog.com/ldcsaa/archive/2012/06/15/178763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何养成良好的 C++ 编程习惯（1）—— 内存管理</title><link>http://www.cppblog.com/ldcsaa/archive/2012/04/23/172428.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Mon, 23 Apr 2012 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2012/04/23/172428.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/172428.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2012/04/23/172428.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/172428.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/172428.html</trackback:ping><description><![CDATA[<p><span style="font-size: 18pt"><strong>开篇导读</strong></span></p>
<p>　　&#8220;养成良好的编程习惯&#8221;其实是相当综合的一个命题，可以从多个角度、维度和层次进行论述和评判。如代码的风格、效率和可读性；模块设计的灵活性、可扩展性和耦合度等等。要试图把所有方面都阐述清楚必须花很多的精力，而且也不一定能阐述得全面。因此，本系列文章以软件开发的基础问题为切入点，阐述程序设计和代码编写方面的细节问题，以点带面，旨在激发大家的思考与总结，希望能为大家带来实际的帮助。 &nbsp;&nbsp;&nbsp; 　　　　</p>
<p>　　虽然本系列文章定位为科普读物，但本座相信它们不但适合新手们学习借鉴，同时也能引发老鸟们的反思与共鸣。欢迎大家提出宝贵的意见和反馈 ^_^</p>
<p>　　在开篇讲述本章主要内容之前，本座首先用小小篇幅论述一下一种良好的工作习惯 &#8212;&#8212; 积累、提炼与求精。在工作和学习的过程中，不断把学到的知识通过有效的方式积累起来，形成自己的知识库，随着知识量的扩大，就会得到从量变到质变的提升。另外还要不断地对知识进行提炼，随着自己知识面的扩大以及水平的提升，你肯定会发现原有知识库存在着一些片面、局限、笨拙甚至错误。这时，就需要你有精益求精精的态度和毅力对知识库进行优化整理。</p>
<p>　　也许以上这些各位都曾想过去实施，也明白其中的道理，但是自己就是给自己各种堂而皇之的借口不花时间去做。这样说吧，技术之路不好走，这个行业有两项基本要求：1、对软件开发工作本身有很大兴趣；2、耐得住寂寞。两者缺一不可，否则还是趁年轻早点转行吧，要不转做软件行业的销售、产品或者管理也行，总之就不要做开发 ^_^</p>
<hr />

<p>&nbsp;</p>
<p><strong><span style="font-size: 18pt">内存管理相关问题</span></strong></p>
<p>　　一提起 C/C++ 的内存管理，大部分人脑海里都立刻涌出 new / delete / malloc / free 等几个恐怖的单词吧？的确，C/C++ 的手工内存管理是它们区别于其他语言的一大特点，也像一道屏障立在那些想从其它语言转向 C/C++ 的人士身前。由此也引起各大论坛对 &#8220;C++ 人气低落&#8221;和&#8220;是否应该引入垃圾回收机制&#8221;等相关话题的剧烈争论。本座一直无视这些争论，其实并非本座不关心 C++ 的发展与命运，相反，本座十分关心。虽然从现在的眼光看来，无论是 C++ 身上有多少硬伤，C++ 委员会的大爷们和 C++ 编译器厂商的大佬们如何扯猫尾。毕竟最爱就是最爱，残缺美也是美，不解释。本座之所以不关心这些争论，原因是因为看透了，一门语言就像一种人生，是有生命周期的，没落只是快慢的问题，旧事物总会被新事物取代，这是客观规律不可避免。秦始皇最终不也是没找到长生不老的仙丹么？只要曾经发光发热过，在还有价值的时候能为大众所用就已经无憾了。本座在此还要申明一种态度：本座并不排斥任何语言，相反，本座对新语言的诞生非常感兴趣。会去了解它们的特点，看看它们能帮助解决哪方面的问题。正如这几年，由于工作需要，本座用得最多的是 Java 和一些动态语言（它们的确能解决很多问题），而 C/C++ 却没再用了。</p>
<p>　　嗯，扯远了，我们还是回到正题吧。说起 C/C++ 的内存管理似乎令人望而生畏，满屏的 new / delete / malloc / free，OutPut 窗口无尽的 Memory Leak 警告，程序诡异的 0X00000004 指针异常，仿佛回到那一年我们一起哭过的日子，你 Hold 得住吗？其实，现实并没有你想的那么糟糕。只要你付出一点点，花一点点心思，没错！就一点点而已 &#8212;&#8212; <strong>用 C++ 类封装内存访问</strong>，就会解决你大部分的烦恼，让你受益终身。以 Windows 程序为例，主要有以下几种内存管理方式：</p>
<ul><li><strong>虚拟内存</strong>（Virtual Memory）</li><li><strong>默认堆</strong>和<strong>私有堆</strong>（Process Heap &amp; Private Heap）</li><li><strong>内存映射文件</strong>（File Mapping）</li><li><strong>进程堆栈</strong>（Heap，其实就是用 malloc()&nbsp;或&nbsp;默认的 new 操作符在 Process Heap 里一小块一小块地割肉 ^_^）</li><li><strong>栈</strong>（Stack，内存由调用者或被调用者自动管理） </li></ul>
<p>　　 今天我们的主题是封装，至于每种内存模型的概念和 API 的使用方式在这里就不讲了，Google 一下就知道。其实用 C++ 封装上述前 4 种内存访问的原理都差不多，就是在构造函数或其他操作函数中分配内存，然后再在析构函数中确保内存被正确释放。虚拟内存、默认堆和私有堆的操作方式相似，这里就不一一展示了，有兴趣的朋友可以参考本座前几天发表的那篇无人问津的文章：《<a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/12/2348302.html" target="_blank">C++ 封装私有堆（Private Heap）</a>》，哎！下面对内存映射文件的封装也只稍作介绍、我们主要讨论的是使用频率最高的 malloc() 和 new 的封装。</p>
<hr />

<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>&nbsp;内存映射文件</strong></span></p>
<p>　　下面的代码把 File Mapping 句柄以及从 File Mapping 映射出来的内存分别封装到 CFileMapping 和 CShareMemory 中，可以直接使用 CShareMemory 可以创建一个 File Mapping 以及映射 File Mapping 的内存。</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><pre><span style="color: #0000ff">class</span> CFileMapping<br />{<br /><span style="color: #0000ff">public</span>:<br />    CFileMapping(    <br />                    LPCTSTR lpszName,<br />                    DWORD dwMaximumSizeLow,<br />                    DWORD dwMaximumSizeHigh                            = <span style="color: #800080">0</span>,<br />                    HANDLE hFile                                    = INVALID_HANDLE_VALUE,<br />                    DWORD flProtect                                    = PAGE_READWRITE,<br />                    LPSECURITY_ATTRIBUTES lpFileMappingAttributes    = NULL<br />                )<br />    {<br />        m_hMap    = ::CreateFileMapping    (<br />                                            hFile,<br />                                            lpFileMappingAttributes,<br />                                            flProtect,<br />                                            dwMaximumSizeHigh,<br />                                            dwMaximumSizeLow,<br />                                            lpszName<br />                                        );<br />        ASSERT(IsValid());<br />    }<br /><br />    ~CFileMapping()<br />    {<br />        <span style="color: #0000ff">if</span>(IsValid())<br />            VERIFY(::CloseHandle(m_hMap));<br />    }<br /><br />    LPVOID ViewMap    (<br />                        DWORD dwNumberOfBytesToMap,<br />                        DWORD dwFileOffsetLow,<br />                        DWORD dwFileOffsetHigh    = <span style="color: #800080">0</span>,<br />                        DWORD dwDesiredAccess    = FILE_MAP_ALL_ACCESS<br />                    )<br />    {<br />        <span style="color: #0000ff">return</span> ::MapViewOfFile    (<br />                                    m_hMap,<br />                                    dwDesiredAccess,<br />                                    dwFileOffsetHigh,<br />                                    dwFileOffsetLow,<br />                                    dwNumberOfBytesToMap<br />                                );<br />    }<br /><br />    BOOL UnViewMap(LPCVOID lpBaseAddress)<br />    {<br />        <span style="color: #0000ff">return</span> ::UnmapViewOfFile(lpBaseAddress);<br />    }<br /><br />    <span style="color: #0000ff">operator</span> HANDLE    ()    {<span style="color: #0000ff">return</span> m_hMap;}<br />    BOOL IsValid    ()    {<span style="color: #0000ff">return</span> m_hMap != NULL;}<br /><br /><span style="color: #0000ff">private</span>:<br />    HANDLE m_hMap;<br />    <br />    DECLARE_PRIVATE_COPY_CONSTRUCTOR(CFileMapping)<br />};<br /><br /><span style="color: #0000ff">class</span> CShareMemory<br />{<br /><span style="color: #0000ff">public</span>:<br />    CShareMemory(DWORD dwSize, LPCTSTR lpszName = NULL)<br />    : m_fm(lpszName, dwSize)<br />    {<br />        ASSERT(dwSize &gt; <span style="color: #800080">0</span>);<br />    }<br /><br />    ~CShareMemory()<br />    {<br />        <span style="color: #0000ff">for</span>(<span style="color: #0000ff">set</span>&lt;ULONG_PTR&gt;::const_iterator it = m_set.begin(); it != m_set.end(); ++it)<br />        {<br />            LPVOID pV = (LPVOID)*it;<br />            ASSERT(pV);<br /><br />            m_fm.UnViewMap(pV);<br />        }<br /><br />        m_set.clear();<br />    }<br /><br />    LPVOID Alloc(DWORD dwNumberOfBytesToMap, DWORD dwFileOffsetLow)<br />    {<br />        LPVOID pV = m_fm.ViewMap(dwNumberOfBytesToMap, dwFileOffsetLow);<br /><br />        <span style="color: #0000ff">if</span>(pV) m_set.insert((ULONG_PTR)pV);<br /><br />        ASSERT(pV);<br />        <span style="color: #0000ff">return</span> pV;<br />    }<br /><br />    BOOL Free(LPCVOID lpBaseAddress)<br />    {<br />        ASSERT(lpBaseAddress);<br /><br />        <span style="color: #0000ff">set</span>&lt;ULONG_PTR&gt;::iterator it = m_set.find((ULONG_PTR)lpBaseAddress);<br /><br />        <span style="color: #0000ff">if</span>(it != m_set.end())<br />            m_set.erase(it);<br /><br />        <span style="color: #0000ff">return</span> m_fm.UnViewMap(lpBaseAddress);<br />    }<br /><br /><span style="color: #0000ff">private</span>:<br /><br />    CFileMapping    m_fm;<br />    <span style="color: #0000ff">set</span>&lt;ULONG_PTR&gt;    m_set;<br /><br />    DECLARE_PRIVATE_COPY_CONSTRUCTOR(CShareMemory)<br />};</pre></div>
<p>&nbsp;</p>
<p>　　细心的朋友一定会发觉其实这样封装是有缺点的：首先，CShareMemory 只能做内存共享，不能映射到真实文件（hFile 永远为 INVALID_HANDLE_VALUE）；第二，可以对 CShareMemory 的 Alloc() 和 Free() 方法进一步封装，利用封装类的析构函数自动调用&nbsp;Free()，这样就可以完全消除 &#8220;set&lt;ULONG_PTR&gt;&nbsp;m_set&#8221;&nbsp;这个属性了；第三，CFileMapping 也可以把文件句柄一起封装进来，这样，从 CreateFile() 到 CreateFileMapping() 都受控了。这个不完美的封装就权当反面教材吧 ^_^</p>
<p>&nbsp;</p>
<hr />

<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>malloc() 系列函数</strong></span></p>
<p>　　很多人都建议，在 C++ 中尽量用 new 操作符取代 malloc()，因为 new 类型安全，自动调用构造函数和析构函数等等。关于这点本座略有异议，在某些情形下 malloc() 其实比 new 更好使，效率方面我们可以不计较（几乎所有编译器的&nbsp;new 操作符都用 malloc() 分配内存），从事过偏底层开发的人都清楚，我们避免不了处理 row data（如：socket 的收发缓冲区等）数据，这类数据是非常适合使用 malloc() 的，用 new 分配的内存还要停顿下来想想到底是用 delete、delete[]、::delete、::delete[] 中的哪个释放，malloc() 分配的内存想都不用想，free() 包打天下，何况人家有 realloc() 可以方便地重新调整内存，你有没有 &#8220;renew&#8221; 呢？总之一句话，malloc() 的确是有存在的必要，就看接下来我们如何封装它了，请看代码：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><pre><span style="color: #008000">//</span><span style="color: #008000"> T                 : 数据类型（内置类型或结构体）<br /></span><span style="color: #008000">//</span><span style="color: #008000"> MAX_CACHE_SIZE    : 预申请内存的最大数目，以 sizeof(T) 为单位，如果该值设置合理，对于<br /></span><span style="color: #008000">//</span><span style="color: #008000">                     需要动态递增缓冲区的 buffer 来说能大大提高效率</span><span style="color: #008000"><br /></span>template&lt;<span style="color: #0000ff">class</span> T, size_t MAX_CACHE_SIZE = <span style="color: #800080">0</span>&gt;<br /><span style="color: #0000ff">class</span> CBufferPtrT<br />{<br /><span style="color: #0000ff">public</span>:<br />    <span style="color: #0000ff">explicit</span> CBufferPtrT(size_t size = <span style="color: #800080">0</span>, <span style="color: #0000ff">bool</span> zero = <span style="color: #0000ff">false</span>)    {Reset(); Malloc(size, zero);}<br />    <span style="color: #0000ff">explicit</span> CBufferPtrT(<span style="color: #0000ff">const</span> T* pch, size_t size)    {Reset(); Copy(pch, size);}<br />    <span style="color: #008000">//</span><span style="color: #008000"> 拷贝构造函数要分两种情形</span><span style="color: #008000"><br /></span>    CBufferPtrT(<span style="color: #0000ff">const</span> CBufferPtrT&amp; other)    {Reset(); Copy(other);}<br />    template&lt;size_t S&gt; CBufferPtrT(<span style="color: #0000ff">const</span> CBufferPtrT&lt;T, S&gt;&amp; other)    {Reset(); Copy(other);}<br /><br />    ~CBufferPtrT() {Free();}<br /><br />    T* Malloc(size_t size = <span style="color: #800080">1</span>, <span style="color: #0000ff">bool</span> zero = <span style="color: #0000ff">false</span>)<br />    {<br />        Free();<br />        <span style="color: #0000ff">return</span> Alloc(size, zero, <span style="color: #0000ff">false</span>);<br />    }<br /><br />    T* Realloc(size_t size, <span style="color: #0000ff">bool</span> zero = <span style="color: #0000ff">false</span>)<br />    {<br />        <span style="color: #0000ff">return</span> Alloc(size, zero, <span style="color: #0000ff">true</span>);<br />    }<br /><br />    <span style="color: #0000ff">void</span> Free()<br />    {<br />        <span style="color: #0000ff">if</span>(m_pch)<br />        {<br />            free(m_pch);<br />            Reset();<br />        }<br />    }<br /><br />    template&lt;size_t S&gt; CBufferPtrT&amp; Copy(<span style="color: #0000ff">const</span> CBufferPtrT&lt;T, S&gt;&amp; other)<br />    {<br />        <span style="color: #0000ff">if</span>((<span style="color: #0000ff">void</span>*)&amp;other != (<span style="color: #0000ff">void</span>*)<span style="color: #0000ff">this</span>)<br />            Copy(other.Ptr(), other.Size());<br /><br />        <span style="color: #0000ff">return</span> *<span style="color: #0000ff">this</span>;<br />    }<br /><br />    CBufferPtrT&amp; Copy(<span style="color: #0000ff">const</span> T* pch, size_t size)<br />    {<br />        Malloc(size);<br /><br />        <span style="color: #0000ff">if</span>(m_pch)<br />            memcpy(m_pch, pch, size * <span style="color: #0000ff">sizeof</span>(T));<br /><br />        <span style="color: #0000ff">return</span> *<span style="color: #0000ff">this</span>;<br />    }<br /><br />    <span style="color: #008000">//</span><span style="color: #008000"> 动态扩大 buffer</span><span style="color: #008000"><br /></span>    template&lt;size_t S&gt; CBufferPtrT&amp; Cat(<span style="color: #0000ff">const</span> CBufferPtrT&lt;T, S&gt;&amp; other)<br />    {<br />        <span style="color: #0000ff">if</span>((<span style="color: #0000ff">void</span>*)&amp;other != (<span style="color: #0000ff">void</span>*)<span style="color: #0000ff">this</span>)<br />            Cat(other.Ptr(), other.Size());<br /><br />        <span style="color: #0000ff">return</span> *<span style="color: #0000ff">this</span>;<br />    }<br /><br />    <span style="color: #008000">//</span><span style="color: #008000"> 动态扩大 buffer</span><span style="color: #008000"><br /></span>    CBufferPtrT&amp; Cat(<span style="color: #0000ff">const</span> T* pch, size_t size = <span style="color: #800080">1</span>)<br />    {<br />        size_t pre_size = m_size;<br />        Realloc(m_size + size);<br /><br />        <span style="color: #0000ff">if</span>(m_pch)<br />            memcpy(m_pch + pre_size, pch, size * <span style="color: #0000ff">sizeof</span>(T));<br /><br />        <span style="color: #0000ff">return</span> *<span style="color: #0000ff">this</span>;<br />    }<br /><br />    template&lt;size_t S&gt; <span style="color: #0000ff">bool</span> Equal(<span style="color: #0000ff">const</span> CBufferPtrT&lt;T, S&gt;&amp; other) <span style="color: #0000ff">const</span><br />    {<br />        <span style="color: #0000ff">if</span>((<span style="color: #0000ff">void</span>*)&amp;other == (<span style="color: #0000ff">void</span>*)<span style="color: #0000ff">this</span>)<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span>;<br />        <span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span>(m_size != other.Size())<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span>;<br />        <span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span>(m_size == <span style="color: #800080">0</span>)<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span>;<br />        <span style="color: #0000ff">else</span><br />            <span style="color: #0000ff">return</span> (memcmp(m_pch, other.Ptr(), m_size * <span style="color: #0000ff">sizeof</span>(T)) == <span style="color: #800080">0</span>);<br />    }<br /><br />    <span style="color: #0000ff">bool</span> Equal(T* pch) <span style="color: #0000ff">const</span><br />    {<br />        <span style="color: #0000ff">if</span>(m_pch == pch)<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span>;<br />        <span style="color: #0000ff">else</span> <span style="color: #0000ff">if</span>(!m_pch || !pch)<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span>;<br />        <span style="color: #0000ff">else</span><br />            <span style="color: #0000ff">return</span> (memcmp(m_pch, pch, m_size * <span style="color: #0000ff">sizeof</span>(T)) == <span style="color: #800080">0</span>);<br />    }<br /><br />    T*    Ptr()    {<span style="color: #0000ff">return</span> m_pch;}<br />    <span style="color: #0000ff">const</span> T*    Ptr()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> m_pch;}<br />    T&amp;    Get(<span style="color: #0000ff">int</span> i)    {<span style="color: #0000ff">return</span> *(m_pch + i);}<br />    <span style="color: #0000ff">const</span> T&amp;    Get(<span style="color: #0000ff">int</span> i)    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> *(m_pch + i);}<br />    size_t    Size()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> m_size;}<br />    <span style="color: #0000ff">bool</span>    IsValid()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> m_pch != <span style="color: #800080">0</span>;}<br />    <span style="color: #008000">//</span><span style="color: #008000"> 啊哈，竟然是类型安全的</span><span style="color: #008000"><br /></span>    <span style="color: #0000ff">operator</span>    T*    ()    {<span style="color: #0000ff">return</span> Ptr();}<br />    <span style="color: #0000ff">operator</span> <span style="color: #0000ff">const</span>    T*    ()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> Ptr();}<br />    <span style="color: #008000">//</span><span style="color: #008000"> 哇塞，竟然还支持索引访问</span><span style="color: #008000"><br /></span>    T&amp; <span style="color: #0000ff">operator</span>    []    (<span style="color: #0000ff">int</span> i)    {<span style="color: #0000ff">return</span> Get(i);}<br />    <span style="color: #0000ff">const</span> T&amp; <span style="color: #0000ff">operator</span>    []    (<span style="color: #0000ff">int</span> i)    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> Get(i);}<br />    <span style="color: #0000ff">bool</span> <span style="color: #0000ff">operator</span>    ==    (T* pv)    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> Equal(pv);}<br />    template&lt;size_t S&gt; <span style="color: #0000ff">bool</span> <span style="color: #0000ff">operator</span>    ==    (<span style="color: #0000ff">const</span> CBufferPtrT&lt;T, S&gt;&amp; other)    {<span style="color: #0000ff">return</span> Equal(other);}<br />    <span style="color: #008000">//</span><span style="color: #008000"> 赋值操作符要分两种情形</span><span style="color: #008000"><br /></span>    CBufferPtrT&amp; <span style="color: #0000ff">operator</span>    =    (<span style="color: #0000ff">const</span> CBufferPtrT&amp; other)    {<span style="color: #0000ff">return</span> Copy(other);}<br />    template&lt;size_t S&gt; CBufferPtrT&amp; <span style="color: #0000ff">operator</span>    =    (<span style="color: #0000ff">const</span> CBufferPtrT&lt;T, S&gt;&amp; other)    {<span style="color: #0000ff">return</span> Copy(other);}<br /><br /><span style="color: #0000ff">private</span>:<br />    <span style="color: #0000ff">void</span> Reset()    {m_pch = <span style="color: #800080">0</span>; m_size = <span style="color: #800080">0</span>; m_capacity = <span style="color: #800080">0</span>;}<br />    size_t GetAllocSize(size_t size)    {<span style="color: #0000ff">return</span> max(size, min(size * <span style="color: #800080">2</span>, m_size + MAX_CACHE_SIZE));}<br /><br />    T* Alloc(size_t size, <span style="color: #0000ff">bool</span> zero = <span style="color: #0000ff">false</span>, <span style="color: #0000ff">bool</span> is_realloc = <span style="color: #0000ff">false</span>)<br />    {<br />        <span style="color: #0000ff">if</span>(size &gt;= <span style="color: #800080">0</span> &amp;&amp; size != m_size)<br />        {<br />            size_t rsize = GetAllocSize(size);<br />            <span style="color: #0000ff">if</span>(size &gt; m_capacity || rsize &lt; m_size)<br />            {<br />                m_pch = is_realloc                            ?<br />                   　(T*)realloc(m_pch, rsize * <span style="color: #0000ff">sizeof</span>(T))    :<br />                　　　(T*)malloc(rsize * <span style="color: #0000ff">sizeof</span>(T))            ;<br /><br />                <span style="color: #0000ff">if</span>(m_pch || rsize == <span style="color: #800080">0</span>)<br />                {<br />                    m_size        = size;<br />                    m_capacity    = rsize;<br />                }<br />                <span style="color: #0000ff">else</span><br />                    Reset();<br />            }<br />            <span style="color: #0000ff">else</span><br />                m_size = size;<br />        }<br /><br />        <span style="color: #0000ff">if</span>(zero &amp;&amp; m_pch)<br />            memset(m_pch, <span style="color: #800080">0</span>, m_size * <span style="color: #0000ff">sizeof</span>(T));<br /><br />        <span style="color: #0000ff">return</span> m_pch;<br />    }<br /><br /><span style="color: #0000ff">private</span>:<br />    T*        m_pch;<br />    size_t    m_size;<br />    size_t    m_capacity;<br />};<br /><br /><span style="color: #008000">//</span><span style="color: #008000"> 常用 buffer 类型的 typedef</span><span style="color: #008000"><br /></span>typedef CBufferPtrT&lt;<span style="color: #0000ff">char</span>&gt;            CCharBufferPtr;<br />typedef CBufferPtrT&lt;wchar_t&gt;        CWCharBufferPtr;<br />typedef CBufferPtrT&lt;unsigned <span style="color: #0000ff">char</span>&gt;    CByteBufferPtr;<br />typedef CByteBufferPtr                CBufferPtr;<br /><br />#ifdef _UNICODE<br />    typedef CWCharBufferPtr            CTCharBufferPtr;<br /><span style="color: #0000ff">#else</span><br />    typedef CCharBufferPtr            CTCharBufferPtr;<br /><span style="color: #0000ff">#endif</span></pre></div>
<p><br />　　嗯。这里要解释一下为何需要两个拷贝构造函数和赋值操作符重载，首先，编译器为不同的模板参数生成不同的类，也就是说：CBufferPtrT&lt;int, 1&gt; 和 CBufferPtrT&lt;int, 2&gt; 被看作是不同的类，另外，C++ 编译器为每个类提供了提供了拷贝构造函数和赋值操作符重载的默认实现（浅拷贝）。因此，上述的第一组拷贝构造函数和赋值操作符重载是改写编译器的默认实现，第二组拷贝构造函数和赋值操作符重载是处理其它类到本类的转换。</p>
<p>　　本座对这个封装灰常满意（唯一美中不足的就是 cnblogs 的编辑器太坑爹了，把代码弄乱 ^_^），它并非只是一个普通的 malloc() 封装，完全能可以把它看作是一种&#8220;<strong>支持索引访问的类型安全的动态缓冲区&#8221;</strong>。如果把它放在一个 socket 通信类中作为成员属性，充当跨越多个线程和多个方法访问的接收缓冲区和发送缓冲区的角色就最适合不过了（当然要自己做同步了）。大家可以调试一下下面的测试例子，了解一下它的用法：</p>
<p>&nbsp;</p>
<div class="cnblogs_code" onclick="cnblogs_code_show('d05069d4-5074-4718-b366-5145a577ca75')"><img id="code_img_closed_d05069d4-5074-4718-b366-5145a577ca75" class="code_img_closed" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img style="display: none" id="code_img_opened_d05069d4-5074-4718-b366-5145a577ca75" class="code_img_opened" onclick="cnblogs_code_hide('d05069d4-5074-4718-b366-5145a577ca75',event)" alt="" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"><span class="cnblogs_code_collapse">测试用例</span> 
<div id="cnblogs_code_open_d05069d4-5074-4718-b366-5145a577ca75" class="cnblogs_code_hide"><pre><span style="color: #008080"> 1</span> <span style="color: #0000ff">int</span> _tmain(<span style="color: #0000ff">int</span> argc, _TCHAR* argv[])<br /><span style="color: #008080"> 2</span> {<br /><span style="color: #008080"> 3</span>     CBufferPtr buffer;<br /><span style="color: #008080"> 4</span> <br /><span style="color: #008080"> 5</span>     unsigned <span style="color: #0000ff">char</span> c1    = <span style="color: #800000">'</span><span style="color: #800000">X</span><span style="color: #800000">'</span>;<br /><span style="color: #008080"> 6</span>     unsigned <span style="color: #0000ff">char</span> pc1[] = <span style="color: #800000">"</span><span style="color: #800000">123</span><span style="color: #800000">"</span>;<br /><span style="color: #008080"> 7</span>     unsigned <span style="color: #0000ff">char</span> pc2[] = <span style="color: #800000">"</span><span style="color: #800000">abc</span><span style="color: #800000">"</span>;<br /><span style="color: #008080"> 8</span>     buffer.Cat(&amp;c1);<br /><span style="color: #008080"> 9</span>     buffer.Cat(pc1, <span style="color: #800080">3</span>);<br /><span style="color: #008080">10</span>     buffer.Cat(pc2, <span style="color: #800080">3</span>);<br /><span style="color: #008080">11</span> <br /><span style="color: #008080">12</span>     CBufferPtrT&lt;unsigned <span style="color: #0000ff">char</span>, <span style="color: #800080">10</span>&gt; buffer2 = buffer;<br /><span style="color: #008080">13</span>     buffer2.Cat(buffer);<br /><span style="color: #008080">14</span>     buffer2.Realloc(<span style="color: #800080">0</span>);<br /><span style="color: #008080">15</span> <br /><span style="color: #008080">16</span>     unsigned <span style="color: #0000ff">char</span>* pc = buffer;<br /><span style="color: #008080">17</span>     <span style="color: #0000ff">const</span> unsigned <span style="color: #0000ff">char</span>&amp; c = buffer[<span style="color: #800080">5</span>];<br /><span style="color: #008080">18</span>     buffer[<span style="color: #800080">5</span>] = <span style="color: #800000">'</span><span style="color: #800000">O</span><span style="color: #800000">'</span>;<br /><span style="color: #008080">19</span> <br /><span style="color: #008080">20</span>     <span style="color: #0000ff">short</span> i1    = <span style="color: #800080">0x7FFF</span>;<br /><span style="color: #008080">21</span>     <span style="color: #0000ff">short</span> pi0[] = {<span style="color: #800080">9</span>,<span style="color: #800080">9</span>,<span style="color: #800080">9</span>};<br /><span style="color: #008080">22</span>     <span style="color: #0000ff">short</span> pi1[] = {<span style="color: #800080">1</span>,<span style="color: #800080">2</span>,<span style="color: #800080">3</span>};<br /><span style="color: #008080">23</span>     <span style="color: #0000ff">short</span> pi2[] = {<span style="color: #800080">4</span>,<span style="color: #800080">5</span>,<span style="color: #800080">6</span>};<br /><span style="color: #008080">24</span>     <span style="color: #0000ff">short</span> pi3[] = {<span style="color: #800080">8</span>,<span style="color: #800080">8</span>,<span style="color: #800080">8</span>};<br /><span style="color: #008080">25</span> <br /><span style="color: #008080">26</span>     CBufferPtrT&lt;<span style="color: #0000ff">short</span>, <span style="color: #800080">10</span>&gt; bufferS(pi0, <span style="color: #800080">3</span>);<br /><span style="color: #008080">27</span> <br /><span style="color: #008080">28</span>     bufferS.Cat(&amp;i1);<br /><span style="color: #008080">29</span>     bufferS.Cat(pi1, <span style="color: #800080">3</span>);<br /><span style="color: #008080">30</span>     bufferS.Cat(pi2, <span style="color: #800080">3</span>);<br /><span style="color: #008080">31</span>     bufferS.Cat(pi3, <span style="color: #800080">3</span>);<br /><span style="color: #008080">32</span> <br /><span style="color: #008080">33</span>     CBufferPtrT&lt;<span style="color: #0000ff">short</span>, <span style="color: #800080">5</span>&gt; bufferS2;<br /><span style="color: #008080">34</span>     bufferS2.Malloc(<span style="color: #800080">4</span>);<br /><span style="color: #008080">35</span> <br /><span style="color: #008080">36</span>     bufferS2 = bufferS;<br /><span style="color: #008080">37</span>     bufferS2.Realloc(<span style="color: #800080">30</span>);<br /><span style="color: #008080">38</span> <br /><span style="color: #008080">39</span>     CBufferPtrT&lt;<span style="color: #0000ff">int</span>&gt; bufferI(<span style="color: #800080">5</span>, <span style="color: #0000ff">true</span>);<br /><span style="color: #008080">40</span>     <br /><span style="color: #008080">41</span>     <span style="color: #0000ff">for</span>(size_t i = <span style="color: #800080">0</span>; i &lt; bufferI.Size(); i++)<br /><span style="color: #008080">42</span>         bufferI[i] = i *<span style="color: #800080">10</span>;<br /><span style="color: #008080">43</span> <br /><span style="color: #008080">44</span>     bufferI.Malloc();<br /><span style="color: #008080">45</span>     bufferI[<span style="color: #800080">0</span>] = <span style="color: #800080">123</span>;<br /><span style="color: #008080">46</span> <br /><span style="color: #008080">47</span>     <span style="color: #008000">//</span><span style="color: #008000"> 下面这行编译不通过，正好说明这个类是类型安全的<br /></span><span style="color: #008080">48</span> <span style="color: #008000">//</span><span style="color: #008000"> bufferI = bufferS;</span><span style="color: #008000"><br /></span><span style="color: #008080">49</span> <br /><span style="color: #008080">50</span>     <span style="color: #0000ff">return</span> <span style="color: #800080">0</span>;<br /><span style="color: #008080">51</span> }</pre></div></div>
<p>&nbsp;</p>
<hr />

<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>new&nbsp;&amp; delete</strong></span></p>
<p>　　一说到 new 的封装大家立马想到的就是智能指针吧！没错，就是智能指针。但&nbsp;STL 提供的 auto_ptr 缺陷很多，首先使用起来不方便，竟然连这种写法都不支持：&#8220;std::auto_ptr&lt;int&gt; pi = new int;&#8221;，天理何在啊！更可恨的是不支持数组指针（需要 delete[]），另外如果某些类重载了 new 操作符的话使用它也有很多问题的，还有其它的很多缺点（我忘记了 ^_^）。不过，C++0x 似乎对智能指针作了重大改进，已经有支持引用计数的智能指针了，但不知是否解决数组指针和区分 delete 与 ::delete 的问题（本座没实测，要是您知道麻烦告诉一声 ^_^）。无论如何，下面代码列出的智能指针支持区分 delete / delete[] / ::delete&nbsp;/ ::delete[]。算是 auto_ptr 的改良（也没有使用引用计数），文章篇幅太长了，测试用例就不发了，各位看官自行尝试吧：</p>
<div class="cnblogs_code"><pre><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">                       smart_ptr 单实体或数组智能指针                    </span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty&gt;<br /><span style="color: #0000ff">struct</span> simple_deleter<br />{<br />    <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> delete_ptr(_Ty* pv) {delete pv;}<br />};<br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty&gt;<br /><span style="color: #0000ff">struct</span> global_simple_deleter<br />{<br />    <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> delete_ptr(_Ty* pv) {::delete pv;}<br />};<br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty&gt;<br /><span style="color: #0000ff">struct</span> array_deleter<br />{<br />    <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> delete_ptr(_Ty* pv) {delete[] pv;}<br />};<br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty&gt;<br /><span style="color: #0000ff">struct</span> global_array_deleter<br />{<br />    <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> delete_ptr(_Ty* pv) {::delete[] pv;}<br />};<br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty, <span style="color: #0000ff">class</span> _Deleter&gt;<br /><span style="color: #0000ff">class</span> smart_ptr<br />{<br /><span style="color: #0000ff">public</span>:<br />    smart_ptr(_Ty* _Ptr = <span style="color: #800080">0</span>)                    : _Myptr(_Ptr)                {}<br />    smart_ptr(smart_ptr&lt;_Ty, _Deleter&gt;&amp; _Right)    : _Myptr(_Right.release())    {}<br /><br />    ~smart_ptr()<br />    {<br />        reset();<br />    }<br /><br />    smart_ptr&lt;_Ty, _Deleter&gt;&amp; reset(_Ty* _Ptr = <span style="color: #800080">0</span>)<br />    {<br />        <span style="color: #0000ff">if</span> (_Ptr != _Myptr)<br />        {<br />            <span style="color: #0000ff">if</span>(_Myptr)<br />                _Deleter::delete_ptr(_Myptr);<br /><br />            _Myptr = _Ptr;<br />        }<br /><br />        <span style="color: #0000ff">return</span> *<span style="color: #0000ff">this</span>;<br />    }<br /><br />    smart_ptr&lt;_Ty, _Deleter&gt;&amp; reset(smart_ptr&lt;_Ty, _Deleter&gt;&amp; _Right)<br />    {<br />        <span style="color: #0000ff">if</span> (<span style="color: #0000ff">this</span> != &amp;_Right)<br />            reset(_Right.release());<br /><br />        <span style="color: #0000ff">return</span> *<span style="color: #0000ff">this</span>;<br />    }<br /><br />    _Ty* release()<br />    {<br />        _Ty* _Ptr    = _Myptr;<br />        _Myptr        = <span style="color: #800080">0</span>;<br /><br />        <span style="color: #0000ff">return</span> _Ptr;<br />    }<br /><br />    smart_ptr&lt;_Ty, _Deleter&gt;&amp; <span style="color: #0000ff">operator</span> = (_Ty* _Ptr)                        {<span style="color: #0000ff">return</span> reset(_Ptr);}<br />    smart_ptr&lt;_Ty, _Deleter&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_ptr&lt;_Ty, _Deleter&gt;&amp; _Right)    {<span style="color: #0000ff">return</span> reset(_Right);}<br /><br />    <span style="color: #0000ff">bool</span> is_valid        ()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> _Myptr != <span style="color: #800080">0</span>;}<br />    _Ty&amp; <span style="color: #0000ff">operator</span> *        ()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> *_Myptr;}<br />    _Ty* <span style="color: #0000ff">get</span>            ()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> _Myptr;}<br />    _Ty* <span style="color: #0000ff">operator</span> -&gt;    ()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> _Myptr;}<br />    <span style="color: #0000ff">operator</span> _Ty*        ()    <span style="color: #0000ff">const</span>    {<span style="color: #0000ff">return</span> _Myptr;}<br /><br /><span style="color: #0000ff">private</span>:<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_ptr&lt;_Ty, _Deleter&gt;                    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_ptr&lt;_Ty, _Deleter&gt;&amp;    reset        (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_ptr&lt;_Ty, _Deleter&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br /><br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_ptr&lt;_Ty, _Deleter&gt;                    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Other, _Deleter&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_ptr&lt;_Ty, _Deleter&gt;&amp;    reset        (<span style="color: #0000ff">const</span> smart_ptr&lt;_Other, _Deleter&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_ptr&lt;_Ty, _Deleter&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Other, _Deleter&gt;&amp;);<br /><br /><span style="color: #0000ff">protected</span>:<br />    _Ty* _Myptr;<br />};<br /><br /><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">                    smart_simple_ptr 单实体智能指针                      </span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty&gt;<br /><span style="color: #0000ff">class</span> smart_simple_ptr : <span style="color: #0000ff">public</span> smart_ptr&lt;_Ty, simple_deleter&lt;_Ty&gt;&gt;<br />{<br /><span style="color: #0000ff">public</span>:<br />    smart_simple_ptr(_Ty* _Ptr = <span style="color: #800080">0</span>)                                    : smart_ptr(_Ptr)    {}<br />    smart_simple_ptr(smart_simple_ptr&lt;_Ty&gt;&amp; _Right)                    : smart_ptr(_Right)    {}<br />    smart_simple_ptr(smart_ptr&lt;_Ty, simple_deleter&lt;_Ty&gt;&gt;&amp; _Right)    : smart_ptr(_Right)    {}<br /><br />    smart_simple_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_ptr&lt;_Ty, simple_deleter&lt;_Ty&gt;&gt;&amp; _Right)<br />    {<span style="color: #0000ff">return</span> (smart_simple_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Right);}<br /><br />    smart_simple_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_simple_ptr&lt;_Ty&gt;&amp; _Right)<br />    {<span style="color: #0000ff">return</span> (smart_simple_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Right);}<br /><br />    smart_simple_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (_Ty* _Ptr)<br />    {<span style="color: #0000ff">return</span> (smart_simple_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Ptr);}<br /><br /><span style="color: #0000ff">private</span>:<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_simple_ptr&lt;_Ty&gt;                (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_simple_ptr&lt;_Ty&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br /><br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_simple_ptr&lt;_Ty&gt;                (<span style="color: #0000ff">const</span> smart_simple_ptr&lt;_Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_simple_ptr&lt;_Ty&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_simple_ptr&lt;_Other&gt;&amp;);<br />};<br /><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">           smart_gd_simple_ptr 单实体智能指针 (使用全局 delete)          </span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty&gt;<br /><span style="color: #0000ff">class</span> smart_gd_simple_ptr : <span style="color: #0000ff">public</span> smart_ptr&lt;_Ty, global_simple_deleter&lt;_Ty&gt;&gt;<br />{<br /><span style="color: #0000ff">public</span>:<br />    smart_gd_simple_ptr(_Ty* _Ptr = <span style="color: #800080">0</span>)                                        : smart_ptr(_Ptr)    {}<br />    smart_gd_simple_ptr(smart_gd_simple_ptr&lt;_Ty&gt;&amp; _Right)                    : smart_ptr(_Right)    {}<br />    smart_gd_simple_ptr(smart_ptr&lt;_Ty, global_simple_deleter&lt;_Ty&gt;&gt;&amp; _Right)    : smart_ptr(_Right)    {}<br /><br />    smart_gd_simple_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_ptr&lt;_Ty, global_simple_deleter&lt;_Ty&gt;&gt;&amp; _Right)<br />    {<span style="color: #0000ff">return</span> (smart_gd_simple_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Right);}<br /><br />    smart_gd_simple_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_gd_simple_ptr&lt;_Ty&gt;&amp; _Right)<br />    {<span style="color: #0000ff">return</span> (smart_gd_simple_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Right);}<br /><br />    smart_gd_simple_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (_Ty* _Ptr)<br />    {<span style="color: #0000ff">return</span> (smart_gd_simple_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Ptr);}<br /><br /><span style="color: #0000ff">private</span>:<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_gd_simple_ptr&lt;_Ty&gt;                    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_gd_simple_ptr&lt;_Ty&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br /><br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_gd_simple_ptr&lt;_Ty&gt;                    (<span style="color: #0000ff">const</span> smart_gd_simple_ptr&lt;_Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_gd_simple_ptr&lt;_Ty&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_gd_simple_ptr&lt;_Other&gt;&amp;);<br />};<br /><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">                   smart_array_ptr 数组智能指针                        </span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty&gt;<br /><span style="color: #0000ff">class</span> smart_array_ptr : <span style="color: #0000ff">public</span> smart_ptr&lt;_Ty, array_deleter&lt;_Ty&gt;&gt;<br />{<br /><span style="color: #0000ff">public</span>:<br />    smart_array_ptr(_Ty* _Ptr = <span style="color: #800080">0</span>)                                : smart_ptr(_Ptr)    {}<br />    smart_array_ptr(smart_simple_ptr&lt;_Ty&gt;&amp; _Right)                : smart_ptr(_Right)    {}<br />    smart_array_ptr(smart_ptr&lt;_Ty, array_deleter&lt;_Ty&gt;&gt;&amp; _Right)    : smart_ptr(_Right)    {}<br /><br />    smart_array_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_ptr&lt;_Ty, array_deleter&lt;_Ty&gt;&gt;&amp; _Right)<br />    {<span style="color: #0000ff">return</span> (smart_array_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Right);}<br /><br />    smart_array_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_array_ptr&lt;_Ty&gt;&amp; _Right)<br />    {<span style="color: #0000ff">return</span> (smart_array_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Right);}<br /><br />    smart_array_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (_Ty* _Ptr)<br />    {<span style="color: #0000ff">return</span> (smart_array_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Ptr);}<br /><br /><span style="color: #0000ff">private</span>:<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_array_ptr&lt;_Ty&gt;                    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_array_ptr&lt;_Ty&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br /><br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_array_ptr&lt;_Ty&gt;                    (<span style="color: #0000ff">const</span> smart_array_ptr&lt;_Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_array_ptr&lt;_Ty&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_array_ptr&lt;_Other&gt;&amp;);<br />};<br /><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">          smart_gd_array_ptr 数组智能指针 (使用全局 delete)          </span><span style="color: #008000">*/</span><br /><span style="color: #008000">/*</span><span style="color: #008000">**********************************************************************</span><span style="color: #008000">*/</span><br /><br />template&lt;<span style="color: #0000ff">class</span> _Ty&gt;<br /><span style="color: #0000ff">class</span> smart_gd_array_ptr : <span style="color: #0000ff">public</span> smart_ptr&lt;_Ty, global_array_deleter&lt;_Ty&gt;&gt;<br />{<br /><span style="color: #0000ff">public</span>:<br />    smart_gd_array_ptr(_Ty* _Ptr = <span style="color: #800080">0</span>)                                        : smart_ptr(_Ptr)    {}<br />    smart_gd_array_ptr(smart_gd_array_ptr&lt;_Ty&gt;&amp; _Right)                        : smart_ptr(_Right)    {}<br />    smart_gd_array_ptr(smart_ptr&lt;_Ty, global_array_deleter&lt;_Ty&gt;&gt;&amp; _Right)    : smart_ptr(_Right)    {}<br /><br />    smart_gd_array_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_ptr&lt;_Ty, global_array_deleter&lt;_Ty&gt;&gt;&amp; _Right)<br />    {<span style="color: #0000ff">return</span> (smart_gd_array_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Right);}<br /><br />    smart_gd_array_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (smart_gd_array_ptr&lt;_Ty&gt;&amp; _Right)<br />    {<span style="color: #0000ff">return</span> (smart_gd_array_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Right);}<br /><br />    smart_gd_array_ptr&lt;_Ty&gt;&amp; <span style="color: #0000ff">operator</span> = (_Ty* _Ptr)<br />    {<span style="color: #0000ff">return</span> (smart_gd_array_ptr&lt;_Ty&gt;&amp;)__super::<span style="color: #0000ff">operator</span> = (_Ptr);}<br /><br /><span style="color: #0000ff">private</span>:<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_gd_array_ptr&lt;_Ty&gt;                (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_gd_array_ptr&lt;_Ty&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_ptr&lt;_Ty, _Other&gt;&amp;);<br /><br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_gd_array_ptr&lt;_Ty&gt;                (<span style="color: #0000ff">const</span> smart_gd_array_ptr&lt;_Other&gt;&amp;);<br />    template&lt;<span style="color: #0000ff">class</span> _Other&gt; smart_gd_array_ptr&lt;_Ty&gt;&amp;    <span style="color: #0000ff">operator</span> =    (<span style="color: #0000ff">const</span> smart_gd_array_ptr&lt;_Other&gt;&amp;);<br />};</pre></div>
<p>&nbsp;</p>
<hr />

<p><br /><span style="font-size: 18pt"><strong>&nbsp;后记</strong></span></p>
<ul><li>&nbsp;对于内存管理，其实还有一种情形还没讲的，就是如何优雅地管理 vetor、list、map 这类容器中的指针，这个话题留到以后讨论 STL 时再详细阐述吧。</li><li>在本座的代码中基本上看不到&nbsp;free /&nbsp;delere 这类单词（new 则是有的 &#8212;&#8212; 给智能指针赋值的时候 ^_^），就本座的经验而言，封装如果利用得当确实能减少很多麻烦，使代码更清晰，有条理，降低错误发生几率。</li><li>当然了，封装并不是万能，它不能解决所有问题，关键是靠个人的专注与细心。</li><li>本座码字提出自己的观点，旨在抛砖引玉，激发大家思考如何培养良好的编程习惯，不是权威，更不能尽信。最实在的知识应该来自个人最直接的体验。 </li></ul>
<p>&nbsp;　　敬请期待：《<a href="http://www.cnblogs.com/ldcsaa/archive/2012/02/18/2356652.html">如何养成良好的 C++ 编程习惯（二）&#8212;&#8212; Windows 资源管理</a>》<br /></p>
<p><strong style="color: #800000">&nbsp;</strong></p><strong style="color: #800000">
</strong><p><strong style="color: #800000">&nbsp;<strong style="color: #800000">原文出处：</strong><a href="http://www.cnblogs.com/ldcsaa" target="_blank"><strong>怪兽的博客</strong></a><strong>&nbsp;&nbsp;</strong><a href="http://weibo.com/u/1402935851" target="_blank"><strong>怪兽的微博</strong></a><strong>&nbsp;&nbsp;</strong><a href="http://qun.qq.com/#jointhegroup/gid/75375912" target="_blank"><strong>怪兽乐园Q群</strong></a></strong></p><img src ="http://www.cppblog.com/ldcsaa/aggbug/172428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2012-04-23 10:55 <a href="http://www.cppblog.com/ldcsaa/archive/2012/04/23/172428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现</title><link>http://www.cppblog.com/ldcsaa/archive/2012/04/19/172011.html</link><dc:creator>~怪^_*兽~</dc:creator><author>~怪^_*兽~</author><pubDate>Thu, 19 Apr 2012 09:51:00 GMT</pubDate><guid>http://www.cppblog.com/ldcsaa/archive/2012/04/19/172011.html</guid><wfw:comment>http://www.cppblog.com/ldcsaa/comments/172011.html</wfw:comment><comments>http://www.cppblog.com/ldcsaa/archive/2012/04/19/172011.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/ldcsaa/comments/commentRss/172011.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ldcsaa/services/trackbacks/172011.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计概述　　服务端通信组件的设计是一项非常严谨的工作，其中性能、伸缩性和稳定性是必须考虑的硬性质量指标，若要把组件设计为通用组件提供给多种已知或未知的上层应用使用，则设计的难度更会大大增加，通用性、可用性和灵活性必须考虑在内。　　现以一个基于 IOCP 的通用异步 Windows Socket TCP 服务端组件为例子，讲述其设计与实现相关的问题，希望能引发大家的思考，对大家日后开展相关类...&nbsp;&nbsp;<a href='http://www.cppblog.com/ldcsaa/archive/2012/04/19/172011.html'>阅读全文</a><img src ="http://www.cppblog.com/ldcsaa/aggbug/172011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ldcsaa/" target="_blank">~怪^_*兽~</a> 2012-04-19 17:51 <a href="http://www.cppblog.com/ldcsaa/archive/2012/04/19/172011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>