摘要: new和delete是C++中进行内存分配和释放的基本接口,程序员对内存的管理就是依靠这两个接口完成.既然C++的编译器已经提供了new和delete接口,那我们为什么重新定制new和delete.这就引出第一个问题,什么情况下需要重新定制new和delete?(肯定是编译器提供的new和delete满足需求的时候)1.用来检测运用上的错误 编程的过程中,可能出现导致数据"overruns"(写入点在分配区块尾端之后)或"underruns"(写入点在分配区块起点之前).如果我们自行定义一个operator news,便可超额分配内存,以额外空间(位于客 阅读全文
posted @ 2012-07-28 18:15 一点心青 阅读(1121) 评论(0) 推荐(0) 编辑
摘要: 前两天,睡觉前,偶尔翻起算法导论,看到随机函数这一块内容,里面有一个练习题.5.1-2 描述random(a,b)过程的一种实现,它只调用random(0,1).作为a和b的函数,你的程序的期望运行时间是多少?注:random(a,b)为产生a,a+1,a+2,...,b的函数发生器,且产生各整数的概率相等,同为1/(b - a + 1).看到这个题目时,似曾相识,脑海浮现了利用random(0,1)产生0或1,从而组成二进制数,来完成random(a,b)的实现.但是细想以后,感觉有个问题在脑海中有点不明不白.运行random(0,1)函数k次,使得2k>=(b-a+1),将得到[0, 阅读全文
posted @ 2012-07-28 14:41 一点心青 阅读(11711) 评论(2) 推荐(0) 编辑
摘要: 经常会对文体文件进行逐行处理,在Shell里面如何获取每行数据,然后处理该行数据,最后读取下一行数据,循环处理.有多种解决方法如下:1.通过read命令完成.read命令接收标准输入,或其他文件描述符的输入,得到输入后,read命令将数据放入一个标准变量中.利用read读取文件时,每次调用read命令都会读取文件中的"一行"文本.当文件没有可读的行时,read命令将以非零状态退出.1 cat data.dat | while read line2 do3 echo "File:${line}"4 done5 6 while read line7 do 8 阅读全文
posted @ 2012-07-25 18:40 一点心青 阅读(182356) 评论(0) 推荐(6) 编辑
摘要: shell编程的过程中,经常遇到要获取文件名以及文件后缀名的问题.一般的处理方法如下:1 #code2 file="thisfile.txt"3 echo "filename:${file%.*}"4 echo "extension:${file##*.}"5 #result6 filename:thisfile7 extension:txt其主要是利用了Shell内置的一系列字符串操作符号.具体的相关操作符号介绍如下:表达式含义${#string}$string的长度${string:position}在$string中,从位置$p 阅读全文
posted @ 2012-07-25 14:31 一点心青 阅读(5661) 评论(0) 推荐(0) 编辑
摘要: 面向对象的编程,首先得设计出良好的类体结构和接口,然后是合理的实现.如何自己设计并实现一个字符串类?这个问题看似简单,其实里面也有不少的玄机. 1 class CMyString 2 { 3 public: 4 CMyString(char* pStr = NULL); 5 CMyString(const CMyString& rhs); 6 CMyString& operator=(const CMyString& rhs); 7 ~CMyString(); 8 ..... 9 private:10 char* pData;11 ... 阅读全文
posted @ 2012-07-21 14:24 一点心青 阅读(3880) 评论(0) 推荐(0) 编辑
摘要: OpenCV1.0中错误处理与C语言标准函数库里的错误处理相似,设置全局错误标识,通过检查全局错误标识,来判断程序是否出现错误,并进行错误报告.在OpenCV1.0中,如果调用函数出现错误并不直接返回错误代码,而是用CV_ERROR宏调用cvError函数报错,并设置错误状态,然后调用标准的或者用户自定义的错误处理器.每个程序的线程都有一个全局变量,它包含了错误状(一个整数值).这个状态可以被cvGetErrStatus函数查询到.//保存错误所在的文件和行typedef struct{ const char* file; int line;}CvStackReco... 阅读全文
posted @ 2012-07-19 13:24 一点心青 阅读(7403) 评论(0) 推荐(0) 编辑
摘要: C++中内存管理是需要程序员自己控制,系统不提供垃圾回收器,因此,我们在编程要确保动态分配的内存,必须释放,归还给系统.然而,可能由于程序员的疏忽,或者程序中出现一些异常现象,会导致程序无法到达释放内存的语句,从而造成内存泄露.如何才能避免这样错误,让内存资源管理简单化?解决思路:以对象管理资源,其包含两个关键想法如下.1.获得资源后立刻放进管理对象内.实际上"以对象管理资源"的观念常被称为"资源取得时机便是初始化时机".2.管理对象运用析构函数确保资源被释放.不论控制流如何离开区块,一旦对象被销毁(例如对象离开作用域)其析构函数自然会被自动调用,释放资 阅读全文
posted @ 2012-07-19 10:48 一点心青 阅读(558) 评论(0) 推荐(0) 编辑
摘要: 首先通过一个例子引出自我赋值可能会导致的问题,例子如下: 1 class Bitmap {...}; 2 class Widget { 3 public: 4 ... 5 Widget& operator=(const Widget& rhs); 6 ... 7 private: 8 Bitmap* pb; 9 };10 Widget& Widget::operator=(const Widget& rhs) //一份不安全的operator=实现版本11 {12 delete pb;13 pb = new Bitmap(*rhs.pb);... 阅读全文
posted @ 2012-07-17 20:37 一点心青 阅读(3446) 评论(0) 推荐(3) 编辑
摘要: 私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量.然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明:疑惑:为什么第26行和第32行代码可以编译通过,而第39行和第40行代码会产生编译错误? 1 class CTest { 2 public: 3 CTest(int i); 4 CTest(const CTest& rhs); 5 CTest& operator=(const CTest& rhs); 6 vo... 阅读全文
posted @ 2012-07-17 19:24 一点心青 阅读(18044) 评论(7) 推荐(10) 编辑
摘要: C++提供关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换发生.声明为explicit的构造函数不能在隐式转换中使用.C++中,一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),承担了两个角色.1.是个构造器,2.是个默认且隐含的类型转换操作符.写下如AAA = XXX,这样的代码,且恰好XXX的类型正好是AAA单参数构造的参数类型,这时候编译器就自动调用这个构造器,创建一个AAA的对象.使用explicit声明构造函数,则可防止隐式转换,避免上述情况的发生.具体例子如下: 1 class CTest1 { 2 public: 3 C... 阅读全文
posted @ 2012-07-17 16:52 一点心青 阅读(4948) 评论(0) 推荐(0) 编辑