07 2012 档案

摘要:C++中存在着三种类型的与内存管理相关的接口,new 操作符(new operator),new 操作(operator new)和placement new.下面简单介绍这三种接口区别和联系.new操作符是语言内置的操作符,像sizeof一样,我们不能改变它的含义和功能.我们用new操作完成动态对象的创建.它主要完成两部分工作:1.分配足够的内存以便容纳所需类型的对象.2.调用构造函数初始化内存中的对象.new操作符分配内存时,需要调用一个内存分配函数完成内存分配的工作.这个函数就是new操作(operator new).函数operator new的声明方式如下:1 void* opera 阅读全文
posted @ 2012-07-29 10:55 一点心青 阅读(686) 评论(0) 推荐(0)
摘要:在概率及博弈论上,秘书问题的描述如下: 要聘请一名秘书,有n个应聘者.每次面试一人,面试后就要及时决定是否聘化,如果当时决定不聘他,他便举回来.面试后总能清楚了解应聘者的合适程度,并能和之前的每个人做比较.问什么样的策略,才使最佳人选被选中的概率最大. 这个问题最优解是一个停止规则.在这个规则里... 阅读全文
posted @ 2012-07-28 19:40 一点心青 阅读(4238) 评论(0) 推荐(0)
摘要:new和delete是C++中进行内存分配和释放的基本接口,程序员对内存的管理就是依靠这两个接口完成.既然C++的编译器已经提供了new和delete接口,那我们为什么重新定制new和delete.这就引出第一个问题,什么情况下需要重新定制new和delete?(肯定是编译器提供的new和delete满足需求的时候)1.用来检测运用上的错误 编程的过程中,可能出现导致数据"overruns"(写入点在分配区块尾端之后)或"underruns"(写入点在分配区块起点之前).如果我们自行定义一个operator news,便可超额分配内存,以额外空间(位于客 阅读全文
posted @ 2012-07-28 18:15 一点心青 阅读(1148) 评论(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 一点心青 阅读(11750) 评论(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 一点心青 阅读(183612) 评论(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 一点心青 阅读(5697) 评论(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 一点心青 阅读(3920) 评论(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 一点心青 阅读(7563) 评论(0) 推荐(0)
摘要:C++中内存管理是需要程序员自己控制,系统不提供垃圾回收器,因此,我们在编程要确保动态分配的内存,必须释放,归还给系统.然而,可能由于程序员的疏忽,或者程序中出现一些异常现象,会导致程序无法到达释放内存的语句,从而造成内存泄露.如何才能避免这样错误,让内存资源管理简单化?解决思路:以对象管理资源,其包含两个关键想法如下.1.获得资源后立刻放进管理对象内.实际上"以对象管理资源"的观念常被称为"资源取得时机便是初始化时机".2.管理对象运用析构函数确保资源被释放.不论控制流如何离开区块,一旦对象被销毁(例如对象离开作用域)其析构函数自然会被自动调用,释放资 阅读全文
posted @ 2012-07-19 10:48 一点心青 阅读(575) 评论(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 一点心青 阅读(3486) 评论(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 一点心青 阅读(18201) 评论(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 一点心青 阅读(4981) 评论(0) 推荐(0)
摘要:在C++中,调用拷贝构造函数有三种情况:1.一个对象作为函数参数,以值传递的方式传入函数体.2.一个对象作为函数返回值,以值传递的方式从函数返回.3.一个对象用于给另外一个对象进行初始化(复制初始化).拷贝构造函数必须以引用的形式传递(参数为引用值).其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的调用来生成函数中的对象.这样会导致无限循环地调用拷贝构造函数,直至栈溢出.以前,一直有个误解,以为以同类型的对象调用"="时,就会调用赋值符.参看以下的例子: 1 class CTest { 2 public: 3 CTest(); 4 CTest(con 阅读全文
posted @ 2012-07-17 11:46 一点心青 阅读(5617) 评论(2) 推荐(1)
摘要:有时候,进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的对象,也就是对该类对象做副本没有任何意义.因此,需要限制编译器自动生动的拷贝构造函数和赋值构造函数.一般参用下面的宏定义的方式进行限制,代码如下:// A macro to disallow the copy constructor and operator= functions // This should be used in the priavte:declarations for a class#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(co... 阅读全文
posted @ 2012-07-16 19:58 一点心青 阅读(13723) 评论(0) 推荐(2)
摘要:程序开发时,经常遇到根据变量获取其类型信息的需求.例如,某一个函数针对不同的类型参取了不同的优化策略,因而要获取相应的类型信息调用对应的函数.template //将迭代器向前移动d单位void advance(IterT& iter,DistT d); //如果d void advance(IterT& iter,DistT d){ if(iter is a random access iterator) { iter += d; //针对random access 迭代器使用迭代器算术运算 } else{ //针对其... 阅读全文
posted @ 2012-07-16 10:10 一点心青 阅读(1654) 评论(0) 推荐(0)
摘要:利用public继承基类,可以将继承的结果分为两类:函数接口继承和函数实现继承. 声明一个纯函数的目的是为了让派生类只继承函数接口.纯虚函数有两个突出的特性: 它们必须被任何"继承了它们"的具体类重新声明,而且它们在抽象类中通常没有定义. 声明非纯虚函数的目的,是让派生类继承该函数的接口和缺省实现. 声明非虚函数的目的,是为了令派生类继承函数的接口及一份强制性实现. 对class进行设计时,声明成员函数,要谨慎选择,不同类型的声明意味根本意义不相同的事情. 下面是经验不足的设计者最常犯的错误: 1.将所有函数声明为非虚函数,相当派生类继承了函数接口和强制性实现,让派生类没有 阅读全文
posted @ 2012-07-16 09:23 一点心青 阅读(1966) 评论(0) 推荐(0)
摘要:假设你正在写一个视频游戏软件,游戏里有各种各样的人物,每个人物都有健康状态,而且不同的人物可能以不同的方式计算他们的健康指数.该如何设计游戏里的人物,主要如何提供一个返回人物健康指数的接口. 方法一,基于虚函数的方法. 在人物角色的基类增加一个成员函数heathValue,返回一个整数,表示人物的健康程度,并将声明为virtual.1 class GameCharacter {2 public:3 virtual int healthValue() const;4 ...5 }; heathValue声明为虚函数,因而派生类可以重新定义它,从而获得达到不同... 阅读全文
posted @ 2012-07-12 19:07 一点心青 阅读(1033) 评论(0) 推荐(0)
摘要:>其中的与众不同主要强调心理学与大众接受的媒体宣传和自身自以为的心理学的不同.从科学角度,逐步阐述心理学的科学性,并在书中以案例的方式解释人们对心理学产生误解的原因.其主要目的,让人们更清楚的认识心理学,从而不被媒体宣传的心理学所误导,不被自身内心的心理学所误导,正确地使用心理学的知识改善自己的生活. 心理学是一门科学,其研究方法遵循其他自然科学的一般研究方法,但其研究对象主要是涉及人类行为,而且许多研究都是基础理论研究,其结果一般是以概率统计的方式展现.因而一般的大众对其研究成果,并没有明确的认识,他们只希望给自己的行为以及自己遇到的行为一种合理的解释.这种鸿沟就导致,一些图利的人们利 阅读全文
posted @ 2012-07-12 09:25 一点心青 阅读(1807) 评论(0) 推荐(0)
摘要:>以心理学,认知科学和神经科学为主要角度,对学习心理学的意义,日常生活中人们如何进行思考,不同的思维方式会带来怎样的价值,何种学习方法才是有效的,以及在数学和计算机科学学习过程中如何分析问题并解决问题做了详细的阐述,强调人们需要主动训练自身的反思能力并掌握有效的思考方法. (PS:上述总结性文字来自网上) 下面主要谈谈自己读完之后的感受: 1.人脑的思维和活动,可以抽象为冯诺依曼体系结构(个人感觉). 冯诺依曼体系结构主要特点是计算机按照人预先存储在存储器的指令和代码来解决各种计算问题,其智慧仍然在于存储指令的人,计算机自身还不具备智慧. 人脑的记忆区域存储着各种指令和代码,相当... 阅读全文
posted @ 2012-07-02 18:32 一点心青 阅读(380) 评论(0) 推荐(0)
摘要:主要介绍利用library injection方法检测内存泄露.library injection就是重载库里面对应的函数,让程序调用library里的函数,而不是调用库函数里的函数.内存泄露主要是重载malloc和free函数,重载后,程序中调用malloc和free分配和释放内存时,就是利用自己编写的malloc和free函数.1.library injection如何完成?在linux环境下,可以利用LD_PRELOAD来指定编译好的重载库.具体的方法如下:1) g++ -shared -fPIC leakfinder.cpp -o leakfinder.so -ldl //编译得到重载 阅读全文
posted @ 2012-07-02 11:05 一点心青 阅读(2161) 评论(0) 推荐(1)