存档

‘源码分享’ 分类的存档

手把手教你调试STL容器(上)

2011年5月3日 3 条评论

众所周知,调试(Debugging)是每个程序员所要必备的基本的技术素养,尤其是对C/C++的程序员来说。对于在linux下用C/C++开发的朋友,相信对GDB不会陌生,当程序有bug或者是出现core dump的时候,GDB是我们最好的朋友。STL是C++相较于C而言,增加的非常强有力的工具,它从某种程度上把C/C++程序员从繁琐的基本数据结构中解放了出来。不过,STL虽然用起来十分方便,但是,用GDB调试过C/C++程序的朋友都有这样痛苦的经历,在GDB状态下,要知道某个STL对象(比如容器)中的数据内容,并不是那么直接、简单。本文的主要内容就是介绍STL中大家比较常用到的容器的基本组成,帮助大家能够在调试的时候更好的驾驭它们。

  • 1. string
  • string是STL中最为常用的类型,它是模板类basic_string用char类型特化后的结果,下面我们来看一下string类型的基本组成: 阅读全文…

    c++ template特化小trick

    2011年4月11日 1 条评论

    前几天在看boost/asio代码的时候,遇到一个奇怪的语法,后查c++ std文档,发现是template特化过程中一个小小的trick,特做此记录,分享给遇到同样问题的朋友,下面先看例子:
    阅读全文…

    事件处理模式之Reactor(二)

    2011年4月5日 2 条评论

    本文是上一篇《事件处理模式之Reactor(一)》的下一篇,上一篇主要介绍了reactor模式的基本理论,这一篇主要通过实例,来介绍Reactor模式的具体使用。在开始本文之前,有必要再说明一下,reactor的源码的地址:reactor源码, 感兴趣的读者朋友可以自己用svn客户端check out到本地。
    如左图所示为reactor项目的基本结构,整体项目分为三个部分:

  • 一是libreactor项目,用来生成reactor相关的lib;
  • 二是server项目,是用reactor实现的一个时间服务器程序;
  • 三是client项目,是用reactor实现的一个客户端程序。
  • 服务端和客户端之间通过telnet协议进行交互,目前仅支持time和exit两个命令,客户向服务端发送time命令,服务端返回当前时间;客户端向服务端发送exit命令,服务端断开客户端连接。如果要实现其它命令,可以直接通过扩展相关处理逻辑来实现。这里我们关注的重点是reactor模式,因此不在支持的命令方面做过多的扩展,感兴趣的朋友可以自己进行扩展。 阅读全文…

    事件处理模式之Reactor(一)

    2011年3月28日 3 条评论

    写过大中型网络服务器的朋友相信对事件处理模型(有时也叫事件触发模型)不陌生。今天要讲的Reactor就是在事件处理模型中用的比较多的一种设计模式。请大家先看下面的图,有个初步的印象:

    在上图中,可以看到主要有以下四种角色:
    1. Reactor:
    Reactor是Reactor模式中最为关键的角色,它是该模式最终向用户提供接口的类。用户可以向Reactor中注册EventHandler(3),然后Reactor在“反应(react)”的时候,发现用户注册的fd上有事件发生,就会回调用户的事件处理函数。下面是一个简单的设计: 阅读全文…

    分享:Discuz论坛自动发帖机

    2011年3月6日 15 条评论

    最近,因为工作上需要,要往自己搭建的discuz论坛系统上发帖。刚开始,在网上找了好多,总是出现各种各样的问题,有的要注册,有的要收费,还有的在用的过程中不稳定,经常出现各种异常。浪费了一整天的时间,没有找到合适的,于是决定自己写一个。下面分享一个做的过程中遇到的一些问题,以及解决的方法。最后,我会把源码分享出来,希望能够对有需要的朋友有所帮助。

    1. 准备工作

    开始动手写程序之前,需要了解一下discuz发帖的基本原理。这里最好的方法就是用抓包工具来抓取浏览器发包时与web服务器之间的交互过程。可选的工具有Firebug和HttpWatch。Firebug是Firefox上专用的,是免费的,不过功能没有HttpWatch强大。HttpWatch是可以在IE和Firefox上用的,功能比较强大,但是收费的,不过网上应该能下到免费版的。我个人比较推荐使用功能强大的HttpWatch。 阅读全文…

    一个基于SAX方法Html解析器(HtmlParser)

    2010年9月27日 12 条评论

    在开始写本文的有必要简单介绍一下SAX,SAX的全称是Simple API for XML,它是一种流式的解析XML文件的方法。它的大致思想是用户向解析器注册一些回调函数,解析器在解析页面的过程中,当特定的事件发生的时候,调用对应的回调函数,完成用户指定的任务。想要详细了解SAX的读者朋友,可以参考:http://en.wikipedia.org/wiki/Simple_API_for_XML。本文所介绍的就是一个用SAX思想实现的HtmlPaser。

  • 1. 如何获取HtmlParser?
  • 可以从http://code.google.com/p/xiao5geproject/source/browse/trunk/htmlparser/获取HtmlParser的源码,任何个人或组织都可以免费使用,如你在使用的过程中发现任何问题,都可以在这里留言。 阅读全文…

    CLucene源码剖析(四) 内存管理与调试

    2009年5月30日 4 条评论

    内存管理,是程序设计中一个永恒的话题,如何进行内存管理,怎么来进行内存管理?通常,如果一个项目的代码中,有比较多的new/delete或者malloc/free,很多有经验的程序员都会想到用内存池(Memory Pool),来减少内存碎片的产生,提高内存的使用效率。不过今天要讨论的重点不是内存池,今天要讨论的重点是CLucene中是如何进行内存管理的,它是怎么做到方便的内存使用情况的跟踪调试的。 阅读全文…

    关于CLucene的一些的资料

    2009年5月29日 没有评论

    1.CLucene在Sourceforge上的主页:http://clucene.wiki.sourceforge.net/
    2.CLucene API文档地址:http://clucene.sourceforge.net/doc/html/index.html
    3.CLucene源代码SVN地址:https://clucene.svn.sourceforge.net/svnroot/clucene

    在主页上,有关于CLucene的介绍,在API文档中,有相关API使用的说明,SVN地址可以用SVN客户端直接把代码check out下来。有了这些就可以开始学习CLucene了~~

    分类: CLucene, 程序人生 标签:

    CLucene源码剖析(三) 实现跨平台的线程安全

    2009年5月29日 没有评论

    在多线程编程中,程序的线程安全(thread-safe)是十分重要的,要做到这一点,一方面要在程序设计的过程中,尽可能设计多的单线程访问的数据结构,一方面就是合理的使用锁(Mutex)。在CLucene中,实现了如下跨平台的锁相关的宏:
    (1) _LUCENE_SLEEP(x) 挂起当前线程 x微秒
    (2) _LUCENE_THREADMUTEX 线程锁(mutex)
    (3) _LUCENE_CURRTHREADID 获取当前线程的thread ID
    (4) _LUCENE_THREADID_TYPE thread ID的类型定义 阅读全文…

    CLucene源码剖析(二) 命名空间的灵活使用

    2009年5月29日 没有评论

    命名空间(namespace)是C++中新提出的一个特性,它的好处就是有效地避免了命名的冲突。在C++项目中,灵活地使用命名空间,可以在避免代码命名冲突的基础上,提高代码的可读性。在CLucene中,命名空间可以通过宏来控制,如果定义了DISABLE_NAMESPACE这个宏,那么整个项目就不使用空间,如果没有定义这个宏,那么命名空间的定义便是有效的。
    下面是CLucene中关于命名空间的宏的定义: 阅读全文…

    CLucene源码剖析(一) 调试信息的输出

    2009年5月27日 3 条评论

    在写比较大型的项目的时候,如何使程序的调试信息能更加方便,优雅的显示出来,也是一件比较好玩的事。最好的效果就是,我在写程序的时候,调试信息越详细越好,而我写完程序,调试完成后,不用再去注释大篇的调试信息,能通过一个较小的改动就把程序中的调试信息去掉,这样就会避免应注释而可能引入新的bug,同时也节省了体力呀! 阅读全文…