
技术类
文章平均质量分 70
songthin
这个作者很懒,什么都没留下…
展开
-
探讨C++中一种管理内存的方法
C++多么多么强大,对内存的控制细致入微,但优点同时即是缺点,你必须清楚的记得你new出来的每一块内存是怎么释放的。所以C++/CLI才把拖管方式引进来,弥补这个问题。我现在不是要讨论C++/CLI,而是传统C++。以前在写课程设计FileSolvent时就做过这种尝试,让类自己管理内存,简单的说,对象在觉得自己该释放的时候就释放,到最后都没释放的就统一释放。但这样必须要做到的就是有一个列表保原创 2006-05-31 22:35:00 · 1609 阅读 · 0 评论 -
用.Net的动态代码生成功能实现AOP
随着AOP的概念被越来越多的讨论,动态代码生成技术也正受到更多人的重视。动态代码生成可以分为动态生成源代码、动态生成中间代码、动态生成机器码等几个层次。动态生成源代码最为简单,各种WEB开发环境都可以理解为这一层次,例如,用ASP很容易写出如下代码:% Response.Write "alert(hello world);" %>而动态生成中间代码或机器代码则要复杂得多,一般来原创 2006-06-16 19:04:00 · 3986 阅读 · 3 评论 -
初探google toolbar上关键词标记的实现方式
google toolbar的功能之一是把指定的关键字高亮显示出来,只要在搜索框里写上想要高亮显示的内容,再按“切换此网页上搜索字词的标明状态”按扭,网页上所有这些内容就以某种背景显示出来了。猜想要实现“以某种背景显示出来”这个功能,应该是通过CSS,也就是说google toolbar通过调用浏览器的功能,动态的修改网页的内容,并设置了一些CSS样式。为了证实这个想法,我写了一个简单的网页,内原创 2006-11-16 22:20:00 · 3230 阅读 · 3 评论 -
用内联汇编调虚函数 理解VTABLE原理
虚函数和动态绑定是C++面向对象编程的核心内容之一。要理解C++虚函数的调用本质,就不得不说VPTR和VTABLE。所有拥有虚函数的C++类的大小都比可看到的内容多至少4个字节(如果派生树中存在多继承,就可能多于4个字节),这多出来的4个字节就是VPTR,它位于每个实例的最前方。VPTR的内容就是一个unsigned int的地址,指向一个内存区域,而这个被指向的内存区域就是VTABLE,所谓虚函原创 2006-11-17 13:16:00 · 3305 阅读 · 1 评论 -
设想一种防U盘病毒的方法,不知道是否管用
如今U盘病毒实在是太普遍了,也太烦人了。把U盘往别人电脑上一插,再往自己电脑上一插,自己的电脑就很可能中毒了。从前一阵的RavMon.exe,到后来的tel.xls.exe,再到大规模泛滥的viking,病毒基本上都是利用Windows的自动播放功能来运行自己,进而传播的。可能当初MS在设计这个功能时认为能生产光盘的人很少,所以往盘里面加恶意程序的机会也不多,而如今随着网上ISO、光盘刻录机的流行原创 2006-12-28 00:44:00 · 3436 阅读 · 2 评论 -
基于动态代码生成技术的动态对象工厂
C#中所有的引用类型的实例都需要在运行时动态创建,创建对象实例最常见的办法就是使用new操作符,使用new操作符就需要在编译器明确的知道要创建的对象的类型,如果在编译器并不能明确,就需要用到反射技术,例如: String className = "MyNamesapce.MyClass"; ConstructorInfo ci =原创 2007-02-20 21:46:00 · 8433 阅读 · 4 评论 -
对《基于动态代码生成技术的动态对象工厂》一文的补充
写完《基于动态代码生成技术的动态对象工厂》一文后我一直很奇怪为什么动态代码生成的方法相对于直接使用new有如此大的劣势?道理上说动态代码一旦生成,那么它和原生代码应该也没什么区别了,那么它的执行效率应该和相应的原生代码差别不大才对。仔细观察Creator.New版本的执行过程,我猜测问题并不是出在动态生成的代码本身,而是出在周围的代码上。在我的测试程序中,我对以下代码返复调用1000万次:原创 2007-02-24 02:00:00 · 4886 阅读 · 1 评论 -
结合短路法和逗号表达式,代替if和三目运算符
C/C++系列语言中,if-else语句是最主要的条件分支语句:if(A) B;else C;其功能就是如果A成立,则执行B,否则执行C。类似的还是三目运算符:A?B:C;其功能与if语句类似,并且由于是表达式,它也有返回值,返回的就是被实际执行的语句的返回值。但如果既不使用if语句又不使用三目运算法,有没有办法也进行条件分支呢?答案是肯定的,方式就是使用“短路法”。C/C++系列语言的逻辑运算法原创 2007-04-03 00:50:00 · 6187 阅读 · 2 评论 -
深入C++的new
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:class A{原创 2007-07-23 21:46:00 · 149444 阅读 · 30 评论 -
一些匿名语言元素
一些匿名语言元素 本文将涉及Java语言的匿名类、C#语言的匿名委托和Javascript的匿名函数。由于具体的名称不同,这里统称它们为“匿名语言元素” 1 Java的匿名类匿名类是Java语言中很重要的特性,从很早开始就得到Java语言的支持了。例如:publicinterface MyInterface ...{ void doSomething()原创 2007-05-11 16:19:00 · 3738 阅读 · 0 评论 -
我的一个长久以来的误区,关于C
我的一个长久以来的误区,关于C 很久以前学C语言的时候就知道了#define,它可以用来定义宏,宏至少有两个作用,一是作为常量,二是作为很短的函数或代码段。后来学到C++,提到了取代#define的两个关键字,一是const,一是inline。上大一的时候学校也开了C语言课,后面有一章是介绍C++,其中涉及到C++的两个关键字,分别是const和volatile,前者用来定义常量,后原创 2007-09-19 22:46:00 · 4479 阅读 · 2 评论 -
C#中的try与finally
C#中的try与finally 1 finally与returntry-catch-finally是很常用的语法结构,用来控制可能发生异常时的程序流程,其中catch和finally至少要有一个。初学try语法时可能会要问一个问题:如果在try块中return,那么finally还会执行吗?答案是肯定的。这个非常容易验证,就不举例子了。这样带来一些很好的特性,例如我们可以在try原创 2008-03-17 20:58:00 · 5395 阅读 · 1 评论 -
Win32环境下两种用于C++的线程同步类(下)
上一篇中我介绍了一种通过封闭Critical Section对象而方便的使用互斥锁的方式,文中所有的例子是两个线程对同一数据一读一写,因此需要让它们在这里互斥,不能同时访问。而在实际情况中可能会有更复杂的情况出现,就是多个线程访问同一数据,一部分是读,一部分是写。我们知道只有读-写或写-写同时进行时可能会出现问题,而读-读则可以同时进行,因为它们不会对数据进行修改,所以也有必要在C++中封装原创 2006-10-17 15:17:00 · 2660 阅读 · 0 评论 -
Win32环境下两种用于C++的线程同步类(上)
线程同步是多线程程序设计的核心内容,它的目的是正确处理多线程并发时的各种问题,例如线程的等待、多个线程访问同一数据时的互斥,防死锁等。Win32提供多种内核对象和手段用于线程同步,如互斥量、信号量、事件、临界区等。所不同的是,互斥量、信号量、事件都是Windows的内核对象,当程序对这些对象进行控制时会自动转换到核心态,而临界区本身不是内核对象,它是工作在用户态的。我们知道从用户态转换到核心原创 2006-10-17 13:58:00 · 4359 阅读 · 1 评论 -
思考一个模式识别与机器学习相关的问题
(上高中时产生的想法,但不知道有没有人做过相关的研究)我们知道,模式识别与机器学习方法在文字扫描识别和手写识别领域有着非常成功的应用,我们可以通过断的指出机器识别手写文字的错误来让机器逐渐适应我们的手写字体,从而不断提高机器的识别正确率。但这种识别的一个弱点在于,我们总需要人为的指出机器识别的错误,机器是不可能自己觉得自己有错的。设想一种有前提约束的条件,例如,要识别一串文件,里面的数字5和字母S原创 2006-05-31 22:44:00 · 2498 阅读 · 1 评论 -
VB调用DLL导出函数出现“Bad DLL call convention”的解决
用VB6调用VC6下编译的DLL中的导出函数,调试运行时会报告“Bad DLL call convention”,而编译成EXE以后直接运行则没有问题。上网查阅文章后发现,解释方式下的VB调用C语言写的函数,仅限于PASCAL调用约定的函数,也就是stdcall方式,而C方式的函数(cdecl)是不行的,编译运行时无此限制。解决方法,打开DLL文件源代码,在导出函数的声明和实现前面都加上关原创 2006-05-31 22:48:00 · 4955 阅读 · 0 评论 -
理解HTTP消息头 1
但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。做过Socket编程的人都知道,当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。HTTP传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,后者是可选的,而前者是必原创 2006-05-31 22:52:00 · 3525 阅读 · 0 评论 -
理解HTTP消息头 2
常见的HTTP返回码上一篇文章里我简要的说了说HTTP消息头的格式,注意到在服务器返回的HTTP消息头里有一个“HTTP/1.1 200 OK”,这里的200是HTTP规定的返回代码,表示请求已经被正常处理完成。浏览器通过这个返回代码就可以知道服务器对所发请求的处理情况是什么,每一种返回代码都有自己的含义。这里列举几种常见的返回码。1 403 Access Forbidden如果我们试原创 2006-05-31 22:53:00 · 4200 阅读 · 1 评论 -
理解HTTP消息头 3
(三) 客户端发送的内容这一次主要来观察HTTP消息头中客户端的请求,从中找到一些有意思的内容。 1 HTTP_REFERER写两个简单的网页:a.htm:to page bb.htm:haha内容很简单,就是网页A中有一个到B的链接。把它们放到IIS上,并访问网页A,从中再点击到B的链接,于是看到了B页的“haha”。那么这两次请求有什么不同吗?观察它们所发送的HTTP消息头,最明显的区原创 2006-05-31 22:54:00 · 2404 阅读 · 2 评论 -
理解HTTP消息头 4
服务器返回的消息服务器返回的HTTP消息也分为消息头和消息体两部分。前面连载的第二篇里已经介绍了返回消息中常见返回代码的含义。对于非正常的返回代码的处理比较简单,只要照着要求去做就好了,而对于正常的返回代码(200),其处理方式就多种多样了。1 Content-TypeContent-Type是返回消息中非常重要的内容,它标识出这个返回内容的类型,其值为“主类型/子类型”的格式,例如最原创 2006-05-31 22:55:00 · 2125 阅读 · 1 评论 -
胡乱思考一些和COM有关的问题
今天突然想起来一些和COM有关的问题,自己答不上来,列在这里,也许有一天能答上来了再把答案补在后面。各位朋友如果有好的答案也希望能不吝赐教,呵呵。问题: 1 对于实现IDispatch的对象,如果不依靠IDE的支持,还需要为每个方法写IDispath的访问代码吗(即如何把对Dispatch ID的访问变为真正的方法调用)?2 VB、VBScript这样的语言只能使用实现了IDispat原创 2006-05-31 22:57:00 · 1393 阅读 · 0 评论 -
.Net中的TLS(线程局部存储)
一些编译器(如VC++中的CL)支持所谓“TLS(Thread Local Storage)”的特性,它的意思是让静态变量的唯一性只作用于线程内,在一个类中声明的一个静态变量对于两个线程来说是两个变量,如:__declspec(thread) static int a;.Net下也支持TLS,它是通过变量属性的方式来声明的。例如,下面的代码: using System;using原创 2006-05-31 22:59:00 · 2637 阅读 · 0 评论 -
Flash的Socket与WebService功能
最近接触了Flash。当然以我的能力肯定做不了动画的,而是把Flash当成一个受管的编程平台,去做一些小程序的开发了。第一个问题是Socket。Flash是支持TCP Socket的,但实现起来有点别扭。首先我没有发现Flash有监听端口的能力,这也正常,如果用户打开一个带Flash的网页,就会监听一个端口,那确实有点不厚道。在flash中Socket类叫做XMLSocket,通过Connec原创 2006-05-31 23:00:00 · 3593 阅读 · 2 评论 -
一种基于.Net 2.0的另类AOP
说这种方法是AOP其实有些牵强,只能说是多少带出了一点面向切面编程的影子。不过它的实现方法很简洁,不需要任何复杂的库的支持,唯一需要的就是C# 2.0,使用的关键技术是泛型编程和匿名委托。我的需求是这样的:比如有一个函数,要从一个配置中取得一个整数值:int GetIntValue(){ try { return Int32.Parse(System.Configuration.Conf原创 2006-05-31 23:08:00 · 2891 阅读 · 1 评论 -
数字家庭 (一) 开机
数码产品种类越来越多,让人目不暇接。当多种数码产品以及电脑、网络等放到一起的时候,就是我们充分发挥想象力,创造各种奇特的应用的时候了。就拿这开机说起吧。当只有一台电脑的时候,开机是件再普通不过的事情了,轻轻按一下电源,开机就实现了。而当有两台电脑时,一台电脑已经打开了,现在我要打开另一台,是不是一定要站起来,走过去,按下电源呢?答案就不一定了。这里我要举两个例子,一是用一台电脑为另一台电脑开机原创 2008-12-04 23:21:00 · 2416 阅读 · 0 评论