
C与C++
文章平均质量分 84
snowq
这个作者很懒,什么都没留下…
展开
-
浅谈缓冲区溢出(整理自《深入理解计算机系统》)
一、综述在x86体系结构下, C++/C对数组引用不进行任何边界检查,而且函数调用过程中局部变量和状态信息(例如寄存器值和返回指针)都存放在栈中。当这两种情况结合到一起的时候,就有可能导致严重的程序错误,一个对越界的数组元素的写操作会破坏存储在栈中的状态信息,而当程序使用这个被破坏的状态,并试图重新加载寄存器或执行ret指令(返回调用函数)时,就会产生严重的错误。二、C++/C中的数组原创 2007-08-17 22:05:00 · 2359 阅读 · 0 评论 -
从抽象到模式——面向对象之旅(三)、设计模式的力量
上一节,我们引入了一个不大不小的变更,然而不经思考的编码却给我们带来了不少麻烦。万不得以,只能重构。Class Filter{public: Filter(RuleReader *ruleReader); virtual ~Filter(); void InitRules(); virtual void CheckRequest(str原创 2009-06-21 22:25:00 · 819 阅读 · 0 评论 -
从抽象到模式——面向对象之旅(二)、代码的坏味道
在上一节中,我们设计了一个过滤器的抽象类,并且在客户代码中通过抽象,很好地利用了类的接口。瞧,抽象是多么地强大,多态是多么强大!天是蓝的,水是清的,生活真是美好啊(Copy某位大师的口吻^_^)。 但是,不要高兴太早,问题来了。现在,我们有一个新的需求: 为了提供更好的扩展性,要求每个过滤器除了提供一套默认规则之外,还要允许客户(即系统的使用者)可以根据需要对规则进行扩充,当然,原创 2009-06-21 21:33:00 · 881 阅读 · 0 评论 -
从抽象到模式——面向对象之旅(一)、抽象的魅力
最近一段时间,笔者设计了一款过滤器插件,用以对某系统的用户请求进行过滤,本系列文章即记载了整个过滤器插件开发过程中的一些面向对象设计的小事,一方面见证笔者对面向对象设计的一次探索,另一方面也是记录下来供大家一起学习和讨探。 在本系列文章中,您将会看到我们是如何从最初的过滤器类的抽象,利用面向对象原则、设计模式等,一步一步将我们的项目重构成为最终看起来还比较“优雅”的样子。由于我们这里只讨原创 2009-06-21 19:53:00 · 1005 阅读 · 0 评论 -
由中兴一道笔试题想到的
c++编程实现: 一个Point类,然后一个Circle类,继承Point类。circle类能够实现求圆的面积,移动圆的位置,改变圆的大小。 基于实际应用的考虑:Circle派生自Point,乍一想圆缩小到最后不就是个点嘛,这个还算合情合理。但是当圆遇到圆心时问题就出现了。A Circle is not a Point. It is implemented in terms of原创 2008-11-02 11:20:00 · 1367 阅读 · 1 评论 -
C++泛型idioms之一: trait
刚着手写这篇文章的时候,实在不知道该从何处下笔,关于泛型技术有太多的东西可写。 这里我不打算详细讲解关于泛型,关于template的语法细则,单单这一部分完全可以写一本书出来,而且也确实已经有很好的资源可以供我们参考----《C++ Templates - The Complete Guide》。除了语法,还有什么?Template?STL?是的,对于C++来说,泛型程序设计本身就是基于模原创 2008-10-04 10:07:00 · 2687 阅读 · 0 评论 -
STL 中的List排序算法(in SGI STL)
template class T, class Alloc>void list::sort() { if (node->next == node || link_type(node->next)->next == node) return; list carry; list counter[64]; int fill = 0; while (!empty(原创 2008-06-05 19:46:00 · 1709 阅读 · 0 评论 -
C语言指针的初始化和赋值
最近写了一个小程序,遇到一点小问题,是关于指向字符串的指针的。由此一发不可收拾,好奇心驱使我决定研究一下指针的初始化和赋值规则。略有所得之后,执笔记下,以备后用。1、指针的初始化初看起来,指针的初始化和赋值好像很混乱,又是*,又是&,时不时又出来一个数组。其实总结起来很简单:int *p; int a=25; int b[10];int *m=&a;int *n=b;原创 2008-01-17 21:04:00 · 38525 阅读 · 19 评论 -
《深度探索C++对象模型》读书笔记5:临时性对象
一、什么时候会导致编译器产生临时性对象?在某些环境下, 由processor产生临时性对象是有必要的,亦或是比较方便的,这样的临时性对象由编译器来定义。可能产生临时性对象的情况有三种:1、形如下式的变量初始化,会产生一个临时性对象,放置a+b的结果,然后再使用T的copy constructor把该临时性对象作为C的初始值。但若直接以拷贝构造的方式,将a+b的值放到c中,就不需要临原创 2008-04-11 09:47:00 · 1019 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记4:构造语意学,编译器背着我们做了什么?
对于C++程序员而言,编译器背着我们做了太多的事情。这一节,我将要带你一起发掘编译器对于对象构造过程的干涉。1、 Default ConstructorC++新手一般有两个常见的误解:1) 任何class如果没有定义default constructor ,就会被合成出一个来。2) 编译器合成出来的default constructor会明确设定类内每一个数据成员的原创 2008-01-15 21:16:00 · 1410 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记3:C++中的多态,这跟指针有什么关系?
1、 C++的运行时多态因为每个派生类对象中都包含基类部分,所以可将基类类型的引用或者指针绑定到派生类对象中的基类部分,而对象本身并不会改变,仍为派生类对象。通过该指针或者引用调用虚函数时,编译器将生成代码,在运行时确定调用哪个函数,被调用的是与动态类型相对应的函数,也就是派生类中定义的虚函数实现。而且,只有通过引用或者指针调用,虚函数才会在运行时确定。如果调用的是非虚函数,原创 2008-01-05 16:30:00 · 1623 阅读 · 1 评论 -
《深度探索C++对象模型》读书笔记2:C++对象模型,我的虚拟函数被放在哪里?
首先,让我们来看一下C++类对象中,各种成员是如何布局的,即C++对象模型。本篇内容也是今后讨论C++底层经常要用到的,因此在进一步深入研究C++的其他主题之前,了解一下本文的内容是非常必要的。C++对象模型,从简单对象模型到表格驱动对象模型,几经演变,最终形成了C++标准中的对象模型。 1、C++对象模型众所周知,在C++类中,有两种数据成员:static和nonstatic,三原创 2008-01-05 13:03:00 · 1361 阅读 · 0 评论 -
《深度探索C++对象模型》读书笔记1:引言,《深度探索C++对象模型》值得一读
《深度探索C++对象模型》为我们揭开了C++语言封装背后的技术细节,读完之后有一种“醍醐灌顶”的感觉。我想把自己的心得书写成文,一方面跟朋友们分享C++底层的奥秘,另一方面也是对C++的一次复习和总结。我会尽量用浅显的语言让朋友们在读完这系列文章之后,能够对《深度探索C++对象模型》有一个比较全面的认识。当然,如果您有什么不懂的地方也可以留言以交流。在这个系列的文章中,我会从一个初学者的角原创 2008-01-05 11:10:00 · 1027 阅读 · 0 评论 -
又见const
代码很简单:void foo(const char **p);int main(int argc, char **argv){ foo(argv); return 0;}问题很蹊跷:VC编译器报错:不能将参数1从char **转换为const char ** 出错原因:两个指针的类型不同,一个为char *,另一个原创 2008-03-04 13:08:00 · 1109 阅读 · 3 评论 -
个人作品——豆瓣FM客户端
下载地址:RayFile网盘XP、WIN7测试可用,纯绿色版,解压即用;最新版本:0.8.0.2 Alpha(部分功能尚未完善,或者不稳定,敬请谅解)最后更新:2012-02-12 20:00版本更新:0.8 Alpha 优化播放逻辑、列表获取逻辑和歌词显示逻辑,优化登录逻辑0.7 Alpha 更新了豆瓣音乐频道,半成品的加心功能,修复部分BUG0.6 Alpha 加入原创 2012-02-13 20:08:17 · 1580 阅读 · 2 评论