| 威's profile我只是风的影子,根本不存在的东西PhotosBlogLists | Help |
|
30 May 我还是启用这个blog吧毕竟这里留下了我好多的东西。。。 但是新的也继续,并且有更多的内容 http://hi.baidu.com/python23/ 也欢迎访问我的技术blog: http://www.pythonid.com 这个是在csdn的blog 08 June C++中的内存泄露问题 最近几天都在解决一个daemon的内存泄露问题,是用来做信息过滤的,并且是多线程的。
刚刚写完这个程序的时候就发现有内存泄露,平均1000次处理信息后会泄露502K,很严重。 之前我曾经做过一些C程序的内存泄露的检查,C的比较好办一些,只要有内存泄露肯定是 有malloc而没有对应的free, 而由于C++语言本身的复杂性,它的内存泄露检测就没有这么简单了。 比如下面这种情况:
char *test = new char[10];
delete test; 确实是用了delete的,但是写错了,应该是 delete []test 才正确。
还有以下的情况: #include <iostream>
#include <string> using namespace std;
class VBase
{ public: virtual ~VBase(){} // 如果没有这行,就不能释放Test中分配的内存 virtual void test() = 0; }; class Test : public VBase
{ public: Test(){} ~Test(){} virtual void test(){} }; int main() { VBase *vb; Test *test = new Test(); vb = test; delete vb; return 0; } 子类Test被分配了内存空间,可是释放的时候是从父类VBase的指针释放的,这种情况, 如果父类的析构函数不是虚函数,就不会调用子类的析构函数(即使父类是抽象类也是如此!), 从而导致子类中分配的内存不能释放。 对C++语言的掌握不仅仅是能写出可以正确运行的程序来! 能写出稳定、高效、灵活且没有内存泄露的程序来的才算C++用的好。 27 April 把库的搜索路径编译到程序中 通常在linux下的程序都会依赖一堆的so,系统会在/etc/ld.so.conf中定义的路径中寻找这些
动态库。比如装了一个软件,它有一些自己的so,在/opt/myproduct/lib下,很可能它会修改 /etc/ld.so.conf,把/opt/myproduct/lib添加进去,以便自己的程序使用的时候能找到。但这样 引入了一些潜在的问题,容易出来版本混乱,就象我前面遇到的问题,下面两个地方都有同一个库: libfreetype.so.6 => /usr/lib/libfreetype.so.6 libfreetype.so.6 => /opt/gd/lib/libfreetype.so.6 其中第一个是系统的,第二个是由于安装其他软件给附带安装上的,这两个libfreetype.so.6都是 符号连接,系统的是连到libfreetype.so.6.3.8,第二个是libfreetype.so.6.3.7,就这一点小小 的差别就让我的一些程序不能运行,虽然说这也和这个库的设计有关,但这种情况是可以避免的。 就是在gcc编译的参数里带上库的搜索路径,很简单,比如 gcc -Wl,-R/opt/myproduct/lib ...
就把/opt/myproduct/lib带到了编译好的程序中,改程序运行的时候会先到这个路径中搜索库。 这样就不需要通过把/opt/myproduct/lib添加到/etc/ld.so.conf中这种修改系统的办法来达到目的。 16 March python 小技巧
但是还有一种情况,就是如果我有个模块在site-packages里,是一个目录的形式,名字叫 zwtest-0.1,这时候想要import这个模块的话,应该写成: import zwtest-0.1 但是这样就很不爽了,如果出了 zwtest-0.2,连import都的改,有一办法就是在与zwtest-0.1相同目录里建立一个zwtest.pth的文件,里面内容是zwtest-0.1,这样python在查找模块的时候,会把zwtest.pth中的模块全部当成名为zwtest的模块,这时候 import zwtest 就和import zwtest-0.1效果一样了,就是升级了版本,只需要修改zwtest.pth就好了,而且也很好的解决了一个模块的多版本共存问题。并且,*.pth中是可以写多个模块的,一行写一个就行,很cool。 又是符号未定义发现GNOME的东东版本的一致性好难控制,GNOME自己是由很多LIB组合起来 的,这些LIB互相依赖,如果其中一个LIB的版本错了,可能一些程序运行起来很正 常,而还有一些程序就会出问题。 今天在LINUX上装了 pyGTK 和wxPython2.6.2, 他们都是使用GTK的,装好后无 法运行我的程序,报一错误:undefined symbol: FT_GlyphSlot_Embolden(/usr/lib/libcairo.so.2),这样的东西见的太多了,通 常就是和库的版本有关。很恶的问题,记得wxPython在2.6.2版本之前装在比较新 的GNOME上就会有这个错误:undefined symbol: pango_x_get_context,只要 wxPython换到版本2.6.2就好了,这个问题曾经困扰了我好久。 先看看使用的SO的情况,用ldd /usr/lib/libcairo.so.2, 显示: linux-gate.so.1 => (0xffffe000) libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x40075000) libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4007d000) libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40176000) libpng12.so.0 => /opt/gd/lib/libpng12.so.0 (0x40184000) libglitz.so.1 => /usr/lib/libglitz.so.1 (0x401c3000) libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x401e7000) libfreetype.so.6 => /opt/gd/lib/libfreetype.so.6 (0x40218000) libz.so.1 => /lib/libz.so.1 (0x4027d000) libm.so.6 => /lib/tls/libm.so.6 (0x40290000) libc.so.6 => /lib/tls/libc.so.6 (0x402b6000) libdl.so.2 => /lib/libdl.so.2 (0x403d5000) libexpat.so.0 => /usr/lib/libexpat.so.0 (0x403d9000) /lib/ld-linux.so.2 (0x80000000) 果然有问题,libfreetype连错了,它用的是 /opt/gd/lib 下的。在/opt/gd/lib 下的是libfreetype.so.6.3.7, 而我的/usr/lib下的是 libfreetype.so.6.3.8, 版本不一样,就出了问题。至于为什么会连到那个so,是因为我的机器上装了一个 软件,它会安装一个gd,并且装到那个目录,还把/opt/gd/lib加到 了/etc/ld.so.conf中去。问题清楚了,去/etc/ld.so.conf中删除/opt/gd/lib 行,用root用户重新执行ldconfig重新配置了库信息就OK了,再次用 ldd /usr/lib/libcairo.so.2 看到的结果就正常了: linux-gate.so.1 => (0xffffe000) libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x40075000) libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4007d000) libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40176000) libpng12.so.0 => /usr/lib/libpng12.so.0 (0x40184000) libglitz.so.1 => /usr/lib/libglitz.so.1 (0x401c3000) libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x401e7000) libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x40218000) libz.so.1 => /lib/libz.so.1 (0x4027d000) libm.so.6 => /lib/tls/libm.so.6 (0x40290000) libc.so.6 => /lib/tls/libc.so.6 (0x402b6000) libdl.so.2 => /lib/libdl.so.2 (0x403d5000) libexpat.so.0 => /usr/lib/libexpat.so.0 (0x403d9000) /lib/ld-linux.so.2 (0x80000000) 其实像这样的问题,在 LINUX 下是经常出现的,而在Windows下是不容易出这样的 问题的。这个可能和两个系统的发展有关,windows下的绝大部分为商业软件,所 以基本上都会使用自己的库,没有什么开源的东西,不会像LINUX上的程序一样, 很多软件都组合了N多的开源东东。 有利也有弊,这个给LINUX系统带来很多不确 定性,造成一些依赖其他库太多的程序的稳定性不够,一是不能控制别人的程序的 质量,再者,版本的一致性问题到现在没有太好的解决办法,这很容易造成混乱。 28 February Windows2000/XP中强制杀进程的方法这个我也是从网上看到的,觉得挺有用的,2000里面很多进程都是从任务管理器里杀不掉的。
Windows 2000:
ntsd -c q -p 进程ID
注意:System、SMSS.EXE和CSRSS.EXE不能杀,CSRSS.EXE是Win32子系统。
Windows XP:
tasklist 列出系统中正在运行的进程信息
tskill 进程ID 结束该进程ID的进程
21 February 我换桌面了 本来一直用的是 KDE ,无赖它太消耗资源了,我的512内存很快就被耗光,于是换了xfce4,感觉还挺不错,桌面也PP,我决定就用它了~ 我是从源代码安装的,xfce4有个带图形界面的安装程序叫xfce4-4.2.3.2-installer.bin, 官方的www.xfce.org上有下载,运行后会弹出一个窗口,自动编译所有需要的东东,比较方便。 完了用 startxfce4启动就是了,运行起来好快啊。 20 February wxPython中的wx.html的问题 最近一直在写一个发送邮件的python程序,发现自己动手写点东西会得到很多其他方面的知识,比如说,现在也明白了python的国际化是怎么搞的了,还有关于那个XRC的用来描述wxPython的界面的XML文件具体应该怎么使用好。其实也得益于limodo的newedit,newedit确实是做的非常不错的一个编辑器,目前就是还缺少调试(似乎)。 前天我花了一个晚上,想为我的程序做一个HTML的界面,结果发现N多的HTML标记和属性是wxPython(其实就是wxWidget)不支持的,结果当然是只要参考官方文档描述的的该成它可以支持的,这个过程太痛苦了。。主要有几点不爽是: 1. 不支持背景图片,这样我还不得不在表格里嵌入图片而不能使用图片背景,而且此单元格不能被拉伸,不然图片可就遮不住单元格了。 2. 尽量不要在表格中将单元格拆分为有横排有竖排的,这样做,结果是很多单元格无法控制他们的宽度,所以应该让表格尽量的简单,然后在表格中套表格。 3. 不要尝试使用CSS,不支持的。 4. JavaScript也是不支持的。 这样的话,HTML页面只能做的尽可能简单了。。哎,本来还想和Firefox差不多呢。 15 February 怀念 今天又到CU的BSD版看了看,无意间,又翻到了skylove写的纪念“红袖添香”的id封存一周年的帖子来(http://bbs.chinaunix.net/viewthread.php?tid=364193&extra=&page=1),这个帖子回复21页,红袖2003年离开的,2004年发的这个纪念帖,2005年都还有人在回复,所有的人都为她的离去感到可惜。她对BSD版的贡献太大了,虽然身在德国,一直以来她热心的为大家解答了无数的难题,对于一个MM来说,太罕见了。她的技术让人折服,她的乐于助人更是让人佩服。 她的最后一个发帖:(以此怀念一下) 题目为:再见了朋友 我不想对阁下的人品和素质发表多余的评论 也不会就此“问候”一下你们家的女性成员 也将不会妨碍你轻薄他人和庸俗自己的自由 感谢在过去一段时间里给我无私帮助的朋友 以及让我在帮助他人中体会分享快乐的朋友 Farewell, BSD Farewell, ChinaUnix Farewell, all buddies... 无光驱安装中文化的FreeBSD5.4 本来昨天是要写blog的,可昨天重新装了freebsd后中文输入法没有装好,发不了。。 这个是我装FREEBSD最费劲的一次,因为没有光驱,只有3个iso。去下了isoemu这个东西,它可以在windows启动的时候加一个启动选项,可以配置用该选项启动自动使用哪个iso,挺方便。关于isoemu的使用,去下载一个,里面有文档,短小而又清楚。我是修改了isoemu.ini, 在里面设置选择的freebsd的引导光盘的iso为启动执行的iso,然后把CD1的内容提取到一个目录,把CD2的packages目录覆盖到CD1提取出来的目录,然后修改packages下的INDEX文件,这个文件存放的是软件包的路径,就是说是在CD1上还是CD2上,把里面的||1替换为着||,||2替换为||,然后放到FTP上。FTP上这个目录名要命名为5.4-RELEASE(我的是5.4的),这样从FTP安装才找的到。然后FTP一定要可以匿名访问到,不然FreeBSD会很傻的把ftp://user:password@ip这种写法的user,password这部分当成域名来解析,结果是找不到,我开始就犯了这样的错误。 很快就可以装完,FreeBSD安装包里没有带中文语言包,需要去下载一个,我的KDE是3.4,就用的kde-i18n-zh_CN-3.4.0.tar.bz2,先configure再make install, 就装上了。下一步就是要产生于一个xorg.conf的人配置文件,使用命令Xorg -configure 就会在用户目录下生成叫xorg.conf.new的文件,把它复制到/etc/X11/下面,命名为xorg.conf。这个时候使用startx是启动不了KDE的,可以快先xinit, 再在里面用startkde命令启动KDE, OK,不出意外就可以进KDE了,如果出了问题,先删除掉/etc/X11/xorg.conf再重新启动试试。进KDE后用KDE控制中心里的字体安装程序装上simsun.ttf的字体,选择使用该字体,不管是看网页还是什么,简直是完美啊,和windows一样。中文输入法嘛,装fcitx就可以了。这个fcitx一定要把系统的字符设置为zh_CN.GBK行,奇怪,这里要是设置错了,fcitx虽然运行了也不能使用。 FreeBSD5.4里默认startx不是启动的KDE,可以修改用户目录下的.xinitrc,没有这个文件的话可以创建一个,我的.xinitrc内容如下: #!/usr/local/bin/bash export LANG=zh_CN.GBK export LC_ALL=zh_CN.GBK export LC_CTYPE=zh_CN.GBK XMODIFIERS=@im=fcitx fcitx & exec /usr/local/bin/startkde 到这里,已经完全是中文化的显示、输入了,使用起来太方便了! 感觉FreeBSD的KDE比Linux下的KDE快一些,不错不错。 13 February 最近有点懒了 过完年后好多天都没有写blog了,真的是有点懒了,似乎什么事情都不想做,从明天开始我又要每天写了。
前两天把我的工作的机器的系统换成RedHat AS4了,主要是实在是不想用windows了。然后发现几个问题:1。 Redhat的图形界面不愧是所有发行版里最难看的。 2。挂载FAT32分区后,那个分区的文件稍多一点,ls就会卡住,kill都杀不掉。要不是我看在这个发行版编译wxPython比较方便的份上,真的很想装FreeBSD或者Mandrike。
昨天在家里装了一个FreeBSD 5.4的amd64版,由于显卡是geforce的,驱动装上了,中文包和simsun.ttf字体装上之后,中文很美观。下面编译程序也飞快,很满意啊。。有点想在我工作的机器上也装一个。
昨天还为我的linux装了一个新的nvidia驱动,主要是想在linux上开发opengl程序。装完后有了libGL.so, libGLcore.so但是就是没有libGLU.so,这个时候我傻了一点,其实libGLU.so是可以用其他地方的,我今天下了一个SGI的回去试试。 02 February 春节期间 我真的是服了MSN的blog,这个内容我本来是写了的,还提交了,就连标题都提交上了,可内容没有。。我看到标题在就以为都提交上去了,就没有打开看。。现在还得重新补充写一下。
有MM真好,今年过年是和爸爸妈妈以及MM一起过的,好像是10个菜,其中有2个是我做的,嘿嘿。初一去了传说中的地坛庙会,发现除了卖吃的就是卖些玩具,装饰什么的很没意思,中午就坐车
去了西单,然后沿着长安街一直走到王府井,中间路过天安门也拍了几张照片。回到家好累。初二去了颐和园,我以前夏天的时候去过,那时候是凉风习习,现在也是。昆明湖上结冰了,这个好玩,我们在冰上走了走,心都是飘着的,一路在想,千万别掉下去千万别掉下去。。。初三和MM去买了点东西,最失败的事情在这天发生了,买了一篮子坏水果。。。初四去MM家,下午一起去了北海公园,然后初五一起去了故宫。 风, 冷风,
冷风吹。(俺也学学某人)
这天的风TM太大了,脸像正在被刀割一样,脚就像被割掉了一样。辛苦了MM一路陪着我们,手也是一直冰凉冰凉的。初六我们一起在家过的,看看电视什么的就过去了,,感觉这样时间过得最快了。。 初七准备第二天工作了,在家呆了一天,装了两次系统, 不知道怎么回事,我的XP进不去了。。还装了个solaris 10 x86 64位版本的。 26 January 被summer点名刚开始没有搞懂是什么意思,去summer的blog看了看才明白,我也来:
规则:被点名的朋友需在自己的博里公开8个理想伴侣的条件,同时加上说明。 A)必須注明你的理想伴侶是男的或者女的 B)被点到玩游戏的人要写出自己选择伴侣的8个条件 C)要传给另外8个人 一同参与这个游戏并告知对方已被点名 D)玩过游戏的人可以不用再玩 理想伴侣:当然是女的 8个条件: 1、很爱我 2、人品好啊,这个非常重要 3、理解我,千万别没事大吵大闹,有事也尽量不要这样 4、孝顺父母,包括双方的,我也会这样的。 5、看起来感觉好 6、别太懒了,不然就麻烦了。 7、女人也要有责任心 8、明白钱很重要,但不是最重要 应该差不多了吧。。呵呵。满足summer的需求了。。 24 January py2exe越来越爽了 新版本已经可以打包为一个文件了,以前都是一堆dll, pyd的。具体的变化其实只有一个地方。就是options里增加bundle_files项,值为1表示pyd和dll文件会被打包到exe文件中,且不能从文件系统中加载python模块;值为2表示pyd和dll文件会被打包到exe文件中,但是可以从文件系统中加载python模块。另外setup中使用zipfile=None可以不生成library.zip。
例如原来的:
from distutils.core import setup import py2exe includes = ["encodings", "encodings.*"]
options = {"py2exe": { "compressed": 1, "optimize": 2, "includes": includes, } } setup(
version = "0.1.0", description = "search panda", name = "search panda", options = options, windows=[{"script": "search.py", "icon_resources": [(1, "search.ico")] }], ) 只需要改为: from distutils.core import setup import py2exe includes = ["encodings", "encodings.*"]
options = {"py2exe": { "compressed": 1, "optimize": 2, "includes": includes, "bundle_files": 1 } } setup(
version = "0.1.0", description = "search panda", name = "search panda", options = options, zipfile=None, windows=[{"script": "search.py", "icon_resources": [(1, "search.ico")] }], ) 就可以生成一个exe的了。(红色的为添加的内容) 我的想法 最近想写几个小程序,总觉得一些数据结构每次都重复写太麻烦了,我决定自己做一个库,
就叫libzw吧,昨天晚上想了一下,基本确定需要做的内容了。首要的要求是,一定要是线程 安全的,数据结构类的可以在节点中存储任意的数据类型。支持任意的数据类型比较麻烦, 我是考虑如果是自定义的类型(比如结构)需要提供一个创建该结构的函数和销毁该结构的 函数。 1.数据结构:
1> 链表 其中包括一些可以把此链表作为队列、栈使用的函数,当然都是以链表的形式存储的,其实就 相当于脚本语言中的列表。链表节点可存储任意类型的东东。 2> 队列 和前面链表结构的队列不一样,这个有固定大小,所以速度更快,不会产生内存碎片,但是动态改变队列的容量会造成重新创建整个队列。 3> 栈 和链表结构的栈不一样,这个也是固定大小的,与上一个队列类似。动态改变栈容量代价很大。 4> 哈希表 用来通过字符串索引快速定位节点。支持N级哈希,也可以存储任意的数据类型。 5> 二叉排序树 主要是一些对查找速度要求高一点的情况,二叉排序树的插入、查找、删除都比线性表的代价小。 6> B树 用来对大量需要存储到硬盘空间的数据做索引。 2. 编解码 1> 自然语言的编码转码,用iconv 2> base64 3> quoted-printable 4> uu 5> rot13 6> BinHex 7> crc32 8> md5 9> sha1 3. 其他 1> 有边界检查的数组 这个尽量做的轻量级一点,因为数组是非常频繁使用的东西,必要我想用gas来写。 2> 字符串类型 通过一个结构来表示字符串,同时记录字符串分配的长度,通过边界检查来避免越界访问。 3> 字符串缓冲 可以把文件或者字符串通过一个缓冲区来操作,强化按行读取和读取到特定的字符。 这个是最近的计划,先搞定了以后写一些程序也方便。完了顺便也放一份到sourceforge.net上。我比较喜欢open source的。 19 January 不爽 几天没有写blog了,原因是前两天我写一篇blog的时候居然没有提交上去,而也没有任何的错误提示,直接导致丢失了我的东东,甚是不爽,两天没写了。今天我心情终于又好了点了,明天去滑雪,但愿不要摔的太厉害。。
最近怎么总是很困呢。。 16 January 周末在家 周末在家仔细研究了一下gas汇编以及gcc的优化问题,当初我想gas汇编可能很难,现在看来也不算太难,毕竟我以前还是学过masm的,虽然gas的格式有点不一样,基本想法到是一致的。等两天我整理整理贴点上来。
晚上又搞了几下Blender, 对于blender我还是比较喜欢的。我非常欣赏它的用户界面,很PP,而且还可以用python来写脚本,可惜就是不能脱离blender的环境运行。贴几个它的图:
![]() ![]() ![]() ![]() ![]() 似乎贴自己的更有意思。。。。 13 January 几个IDE 自从我的PC上装了cygwin和mingw后,在windows下我也基本不怎么使用VC了,但是编写代码的时候有些麻烦,我一般是用cygwin里的vim,可还是想关注关注windows下的一些可以方便使用cygwin或minggw的ide。收集了几个:
1. Dev-Cpp 这个太有名了,用的非常多,在4年以前我就听说过它,并开始用,带了mingw。
![]() 2. Eclipse 这个虽然是java的ide,但是装了cdt插件后可以开发C/C++的程序的。
3. MinGW Developer Studio 支持 mingw的IDE,有windows,linux,freebsd版本。
4.VIDE 一个可以开发GNU g++和java的IDE,有windows和linux版
![]() 5.Relo 支持g++, Borland C++ , VC的IDE,可以可视化的设计windows的对话框
![]() 6. Pelles C 支持Windows和Pocket PC,似乎不可以用gcc,可以可视化设计对话框
![]() 7. Ultimate++ 一个很cool的IDE,支持mingw,支持好多库,跨平台。有一套自己的库。
8. Code::Block 功能很强的IDE,支持mingw,borland c++,watcom c++,有插件支持界面的可视化设计。
![]() 贴图实在是太慢了。。。。
|
|
|