C/C++
文章平均质量分 56
lw1a2
这个作者很懒,什么都没留下…
展开
-
DTrace简介
基本语法probe/ optional predicates /{ optional action statements;}其中:1) probe:探针,即所要探查的对象。2) optional predicates :DTrace脚本没有if语句,使用/ optional predicates /来替代。3) optio原创 2012-03-24 09:04:07 · 3385 阅读 · 0 评论 -
对象只在堆上创建
使D只能在堆上创建:class B{public: virtual ~B() = 0 { }};class D : public B{private: virtual ~D() { }};int main(){ B* pb = new D; delete pb; return 0;}原创 2009-08-08 20:14:00 · 762 阅读 · 2 评论 -
C++反射的一种实现方式
Reflector.h:#pragma once#include class Reflector{public: virtual ~Reflector(); virtual const char* getClassName() = 0; static std::list m_lstRef;}; Reflector.cpp:#inclu原创 2009-07-27 21:55:00 · 1009 阅读 · 6 评论 -
程序员应该掌握的3种知识
1、业务知识这个不多说了。其实有时候很烦那些变来变去的业务逻辑,但是在某个行业混,不了解业务是很难写出好用的软件的。 2、底层知识包括对语言的掌握,对调试技术的掌握,对操作系统的了解(线程,进程等知识),对数据库的掌握,对类库的使用等。1)作为C++程序员,要想写出的程序效率高,且不容易出错,对语言细节的掌握是必要的。2)不管是Windows下还是UNIX下的调试技术都需要掌握。特原创 2009-01-14 22:31:00 · 6580 阅读 · 9 评论 -
我看过的和想看的C++书籍
(红色部分为拥有的书。好想有个书架呀。) 一、纯C++: 1、《C++ Primer 第三版》精读过很多遍,现在感觉全书拿一个例子来讲的这种模式不是很爽。 2、《C++ Primer 第四版》看过一遍,且有关模板的章节看的很粗。感觉比第三版通俗易懂了,也可能是去掉了一些晦涩的、不常用的部分的原因。 3、《Effective C++ 第二版》只看过电子版,原创 2008-08-07 23:04:00 · 1354 阅读 · 0 评论 -
使用模板将可能的运行时错误变为编译时错误
#include iostream>using namespace std;//当CD不使用模板参数时填充此类class CNull...{public: static CNull* instance() ...{ return &m_oCNull; }private: static CNull m_oCNull;};CNull CNull::m_o原创 2008-05-17 12:16:00 · 966 阅读 · 0 评论 -
计算机的字节序问题
1)IBM、Motorola等芯片采用大字节序(big-endian),多字节数据的第一个字节(数字地址最低的)存储的是最高位的值,例(32位机器):int i = 0x12345687;假设&i = 0x0012FF3C,则:0x0012FF3C 120x0012FF3D 340x0012FF3E 560x0012FF3F 782)DEC、Inter等芯片采用小字节序(little原创 2008-03-22 13:32:00 · 1162 阅读 · 0 评论 -
如何使用多态性数组
1)错误的使用多态性数组详细请见《More Effective C++》条款3,此处只贴出示例代码:#include #include using namespace std;class B{public: virtual void print() const { cout };};class D : public B{public: vir原创 2007-10-24 22:42:00 · 1176 阅读 · 0 评论 -
C++考试复习,总结的几个问题
1、通过子类对象的指针删除子类对象时,无论父类的析构函数是不是虚的,都会调用父类的析构函数。但是通过父类对象的指针(指向子类对象)删除对象时,如果父类的析构函数不是虚的,那么就不会调用子类的析构函数。所以为了保证正确性,要将会派生的类的析构函数声明为虚的。 2、成员函数加上const修饰和不加const,实际声明了两个不同的函数。3、子类的友元类可以通过子类对象去访问父类的保护成员。4原创 2007-09-02 09:01:00 · 1283 阅读 · 0 评论 -
观察者模式与Boost.Signals
1) 观察者模式定义略,各种设计模式的书上都有定义。 2) 观察者模式一般实现观察者模式一般实现,都是“被观察者”保存一个“观察者”的列表,循环这个列表来通知“观察者”。代码,其中使用了boost的智能指针shared_ptr:#include #include #include "boost/shared_ptr.hpp"using namespace std原创 2009-08-17 23:28:00 · 2603 阅读 · 1 评论 -
使用MDB查看变量的值(1)
使用MDB查看变量的值(1)LW1A2@163.COM 本节描述使用MDB查看core文件中变量的基本知识基本概念: 一般程序发生coredump,80%的可能是由于参数的值不对造成的(其他可能是堆栈溢出、多线程等问题造成的)。对于可以复现的问题,一般拿到函数堆栈,通过走读代码基本上就可以定位。对于无法复现的问题,大部分情况需要通过查看变量的值来定位。(注:网上很多原创 2009-10-06 18:32:00 · 3009 阅读 · 2 评论 -
Solaris下使用MDB查看全局变量的值
假设要查看全局变量m_FmSvcMsgQueue的值1) 得到m_FmSvcMsgQueue mangle后的值:nm libfm.so|c++filt|grep m_FmSvcMsgQueue[8323] | 5003644| 32|OBJT |GLOB |0 |19 |m_FmSvcMsgQueuenm libfm.so|grep 8323原创 2012-03-24 09:08:45 · 2070 阅读 · 0 评论 -
Linux下C++国际化
有关国际化应用程序国际化的实质是提供一种机制,使其能根据环境变量或配置文件,来指导程序的行为。当对新的“国家”进行支持时,不用修改代码,只修改资源文件就可以实现。例如,“把LANG设为C,再用vi打开带中文的文件,中文显示乱码”。就是因为vi根据LANG做了某些操作。在Linux下,和国际化相关的locale环境变量有三类:LC_ALL,LC_*(如LC_CTYPE等),LANG。原创 2012-03-24 08:52:19 · 2557 阅读 · 0 评论 -
Solaris10 GCC bus error 一例
Solaris10 GCC bus error 一例环境:Solaris10 SPARCGCC 4.4.2背景:原先代码使用CC编译的,是32位程序。有-O2优化。现在迁移到GCC下,并改为64位程序。调试阶段未加-O2优化。问题:程序运行某些用例,在最后退出时,会报bus error。随机性很大。堆栈是某些全局的string(或map)原创 2011-11-02 15:46:04 · 1772 阅读 · 0 评论 -
SlickEdit + Cygwin,SlickEdit的build窗口显示乱码的问题
Windows下,编辑器使用SlickEdit2010,编译器使用Cygwin的GCC。当编译出错的时候,SlickEdit的build窗口会出现乱码。在Cygwin中直接make,会发现报错的输出中存在全角的单引号,查看Cygwin的环境变量LANG,发现LANG=C.UTF-8。正是因为SlickEdit不认全角的单引号,才导致build窗口显示乱码。解决办法:由于Cygwin里面还要显示中文文件,所以不能修改Windows的环境变量。于是建立一个vs.bat文件,内容如下:set LA原创 2010-08-30 21:01:00 · 2229 阅读 · 1 评论 -
一种定位内存泄露的方法(Linux)
目的:本文是《一种定位内存泄露的方法(Solaris)》对应的Linux版本,调试器使用gdb。主要介绍实例部分。其他请见《一种定位内存泄露的方法(Solaris)》。实例:模拟new失败的程序:#include class ABC{public: virtual ~ABC(){} int i; int j;};原创 2010-05-16 18:35:00 · 9493 阅读 · 1 评论 -
一种定位内存泄露的方法(Solaris)
问题:客户测试的镜像环境出现一个3.8G的core文件,查看堆栈发现是new失败了导致进程abort。因为是32位应用程序,应该是所有的heap空间都被用光了,导致new失败。推测有几种可能:1) 内存泄露导致内存耗尽。2) 有些静态对象处理的不合理,导致一直在增大。3) 有死循环,导致一直在做类似list::insert这样的操作,最终耗尽内存。定位思路:如果是第二种原创 2010-05-15 12:04:00 · 3066 阅读 · 5 评论 -
使用MDB查看变量的值(2)
使用MDB查看变量的值(2)LW1A2@163.COM 本节描述使用MDB查看core文件中STL变量的知识 一、目的在《使用MDB查看变量的值(1)》中,我们 探讨了查看变量值的一般方法,但是对于复杂的对象,一点一点的查看内存太麻烦,MDB提供一种机制,可以自己实现插件来解析内存中的变量。 二、原理在《Solaris 模块调试器指南(819–7055–10)》原创 2010-01-17 16:33:00 · 3012 阅读 · 3 评论 -
关于VC的rebase工具
进程默认加载的基址是0x00400000,DLL默认加载的基址是0x10000000 当一个进程加载多个DLL时,只能有一个DLL被加载到默认基址上,而其他的DLL必须通过“重定向”才能正确使用。“重定向”会降低程序的性能,使用rebase工具可以自动计算并改变DLL的加载基址,提高DLL的性能。使用方法:rebase -b 0x1000000 -v *.dll原创 2009-11-08 18:45:00 · 1373 阅读 · 0 评论 -
使用宏生成C++简单工厂
Fruit.h#pragma once#include class Fruit{public: virtual ~Fruit(){} virtual void print() = 0;}; Apple.h#pragma once#pragma once#include "Fruit.h"#include class App原创 2009-10-21 23:14:00 · 740 阅读 · 0 评论 -
一个类如何使用另一个类的private、protected方法
一个类A使用另一个类B的private/protected函数f(),常见的方法有几种:1) 复制B的f()的内容到A中。最常见的也是代码复用最低的方法。2) 令B为A的成员变量(或在A的某函数中生成B),然后调用B的f()。这时要提升f()的访问权限为public,访问权限有时却是改不了的。如果B为A的成员变量,则A变为有状态的类,在一些情况下是不行的(如A为多线程原创 2009-10-16 23:26:00 · 7236 阅读 · 0 评论 -
C++临时对象的生命周期
有关临时对象的生命周期有三种情况:1)一般情况:临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。例:#include using namespace std;class A{public: A(int i): m_i(i) { cout } ~A()原创 2007-09-02 10:05:00 · 4245 阅读 · 0 评论 -
虚函数和访问限定符
#include using namespace std;class B{public: virtual void f() { cout }};class D : public B{private: virtual void f() { cout }};int main(){ B *pb = new D;原创 2007-09-02 09:22:00 · 1099 阅读 · 0 评论 -
Hello, World
#include windows.h> int main(){ MessageBox (NULL, TEXT ("Hello, World!"), TEXT ("Hello"), 0) ;}原创 2006-10-15 16:59:00 · 835 阅读 · 0 评论 -
小议重载+操作符(作为类成员)
类A如下:class A{public: explicit A(int i=0):i(i){} A operator+(const A& rhs);//法1) //const A operator+(const A& rhs);//法2) //A& operator+(const A& rhs);//法3)private: int i;};类A的重载+操作符可原创 2006-10-05 14:22:00 · 1173 阅读 · 2 评论 -
模板类作为类成员
对于模板类A,如果模板类B把A作为成员,则模板在定义模板B之前,只需声明模板B就可以,不必给出B的定义,只要在实例化B的之前,给出A的定义就可以了。这点很像依赖于模板的函数解析。例如:#include iostream>using namespace std;template class T>class A;template class T>class B{AT> a;};templa原创 2006-10-03 13:07:00 · 3472 阅读 · 0 评论 -
定义多个main及程序不从main进入
那天ViVi问了两个问题:1)在C++中,怎么定义 多个main2)程序怎么不从main进入解决(在DevCPP4.9.9.2中编译通过):1)#includeiostream>using namespace std;namespace NS...{ int main() ...{ }}int main()...{}2) #includ原创 2006-09-28 03:33:00 · 1687 阅读 · 0 评论 -
《C++Primer》3版,需要放到头文件里的和不能放到头文件里的
需要放到头文件里的(后面的为页数):1.包含编译模式的模板函数定义P4212.模板类的静态数据成员P6883.模板类的定义,包括在类外定义的函数P695,P7074.没有在类体里定义的inline成员函数的定义P5135.extern对象声明、函数声明以及inline函数定义P3336.符号常量定义P3337.若把整个类显式特化,则应该把整个类的特化的定义放在一个头文件原创 2006-09-17 13:30:00 · 1507 阅读 · 1 评论 -
求幂集(回溯)
/**//*{1, 2, 3}的幂集为: {1, 2, 3} {1, 2} {1, 3} {2, 3} {1} {2} {3} Φ*/#include vector>#include stdlib.h>#include iostream>using namespace std;void get_powerset(int i, vectorint> A,vectorint>&原创 2006-09-14 16:15:00 · 1887 阅读 · 0 评论 -
8皇后问题(回溯)
递归版本:#include iostream>#include vector>using namespace std;const int N=8;int a[N][N];//检验是否符合条件 bool check(int n,int i,int j)...{ int k,l; for (k=0;kn;k++) for (l=0;ln;l++) ...原创 2006-09-14 16:01:00 · 1068 阅读 · 0 评论 -
网友的个人说明:)
你要是还在用 std:: 的容器,你抬头都不好意思跟 PM 打招呼.你得研究 Cpper 的心理。coder 根本不在乎项目的结果。能在项目中引入 boost::mpl 的人,根本不会在乎多引入一个 loki 和 blitz++.什么叫 Architect 知道吗?Architect 就是,不求最好,只求最绚QQ:19581401原创 2006-09-10 12:44:00 · 1063 阅读 · 0 评论 -
关于Named Return Value(NRV)optimization-返回值优化
首先看一下下面的程序: #include iostream>using namespace std;class A ...{public: A() ...{ cout "A()"endl; } A(const A &rhs) ...{ cout "A(const A &rhs)"endl; } ~A()原创 2006-09-09 20:02:00 · 2188 阅读 · 0 评论 -
C++调用C函数举例
//1.h#ifndef _1_H#define _1_Hvoid foo();#endif--------------------------------//1.c为C语言编译的函数void foo(){ printf("Cs foo/n");}--------------------------------//2.C为C++程序extern "C" { #include "1原创 2006-09-04 15:04:00 · 1586 阅读 · 2 评论 -
关于类的初始化
以下程序: #include iostream>using namespace std;class A{public: A(){cout"A()"endl;} A(const char *c){cout"A(const char *c)"endl;} A& operator=(const char *c){cout"A operator=(const char *c)原创 2006-10-15 17:47:00 · 805 阅读 · 0 评论 -
在DevCPP里使用多线程
今天想测个多线程的例子,原先都是用虚拟机的,感觉太麻烦。前几天看了个贴,可以在devcpp里测,于是就开始捣鼓。默认的里面没有,不知道怎么想的,下了个boost,编译了半天,发现boost的多线程不是我想要的。在网上搜了半天,终于找到了pthread包http://blog.chinaunix.net/upfile/061016195725.rar解开,把里面的文件放到相应的dev原创 2006-10-16 20:04:00 · 2012 阅读 · 1 评论 -
linux下getch
getch在windows中是在conio.h里的,不可移植的。在linux下 :#include stdio.h>#include curses.h>int main(){ initscr(); /* 开始curses模式 */ getch(); endwin(); /* 结束curses模式 */ }gcc -o 1.out 1.c -lcurses原创 2006-10-19 17:20:00 · 1447 阅读 · 0 评论 -
Solaris10下,使用SunStudio11编译ACE
系统:Solaris10(x86),安装在VMware(6.0)下编译器:SunStudio11带的CC,版本为Sun C++ 5.8 2005/10/13ACE:5.51、下载,解压ACE:去网站上下载ACE,然后解压。我所放的目录是/opt/ACE_wrappers2、创建环境变量:以root用户为例,编辑/.profile,加入如下内容:PATH=$PATH:/o原创 2007-08-24 19:47:00 · 2305 阅读 · 0 评论 -
关于字符串相加
本文讨论std::string,const char*,char三种类型的相加情况。正确的 :std::string + std::stringstd::string + const char *const char * + std::stringstring + charchar + string错误的:char + const char *const char * + charcons原创 2007-08-14 20:23:00 · 3161 阅读 · 1 评论 -
PcLint简单使用
版本:PC-lint for C/C++ Version 8.00n环境:VC20031)下载,安装我下载的是免安装版本的,之间解压就可以使用。这里解压到F:/PCLint下。2)F:/PCLint下有个CONFIG.EXE,用它可以进行设置,按照提示做就行了3)VC中设置:工具-外部工具-添加:标题:PcLint(Project)命令:F:/PCLint/LINT原创 2007-07-22 14:12:00 · 2472 阅读 · 1 评论 -
编译ACE
ACE版本:5.5编译器:VC2003中文版1.将下载的ACE文件压缩包解压,比如解压到F:/ACE_wrappers目录下2.在F:/ACE_wrappers/ace下新建config.h,添加如下内容:#define ACE_HAS_STANDARD_CPP_LIBRARY 1#include "ace/config-win32.h"其中#define ACE_HAS_STAN原创 2007-07-08 21:44:00 · 1161 阅读 · 0 评论