自进入大学以来一直对软件开发有着浓厚的兴趣,在北京也有过一年在软件领域进行产品开发的经验,现在更是进入了软件开发的工作岗位。我想一些很普遍的代码开发错误对于我应该是不可原谅的错误。然而,由于运行平台,编译工具,开发工具,目标软件这些复杂的事情相互影响,导致软件开发的复杂性和难度有时超乎想像。
眼下是在一个架构里进行软件开发,有时候把注意力太多地放在自己所不能完全掌握的事情上,比如框架的应用和前人开发的代码上,从而忽略了一些很基本的东西,或者说人的精力本来就没有那么多。废话少说,下面来说说我的错误。
1,目标软件的编译需要用到一个包含各种错误信息定义的头文件,然而这个头文件的生成依赖于一个内部开发的小工具,需要用它来编译一个特定格式的文件来产生这个头文件――这是为了在定义错误信息时,在很多人的前后开发过程中,通过工具编译来保持格式和错误信息的协调,避免人工添加带来的错误。我所犯的错误在于,我居然在使用到这个文件里定义的错误信息时,没有把那个头文件给包含进去,呵呵,一个小case的错误,却如此的不堪。
2,写过C、C++程序的人(抱歉,我很难承认那些看过课本写过一些实验程序的人是写过程序的人。)都会了解指针的危险。一个不能正确使用并及时销毁的指针,就像一支冲锋枪,枪口到处乱指。为了避免这个危险,在要求获取指针的时候,我都去检查指针是否被正确获取,如果没有正确获取,则返回一个错误并退出程序。这样的代码检查是如此之多,乃至于我放松了自己的警惕,进入了一种Ctrl+C,Ctrl+V的重复过程。唯一一次出现了一个new的要求,我轻松地重复了上述过程,却没有考虑到,new和delete的一一对应,犹如飞机的起飞次数应该等于降落的次数。当然,对new回来的指针进行检查,如果出错,然后返回,这一点问题也没有,因为这个时候new并没有成功,也就不需要delete来释放分配的堆空间。偶尔,我突然想到,假如在这个new和delete中间,出现了一个指针返回的情况,那我也会一如既往地检查它,这意味着万一它出错,那我将在没有释放堆空间的情况下退出程序,从而造成内存泄漏!在正常的执行过程中,它是不会出错,任何人都很难察觉这个潜在的错误。一旦某一天,错误浮出水面的条件具备了,大家看到的都是莫名其妙的错误,或许系统总是在运行几十天后莫名其妙的当机,谁都很难说明是什么错误,硬件开发人员,软件开发人员,系统工程师,客服人员,顾客相互抱怨,相互纠缠。很恐怖的一件事情。
幸好,在提交代码之前,我察觉了。
眼下是在一个架构里进行软件开发,有时候把注意力太多地放在自己所不能完全掌握的事情上,比如框架的应用和前人开发的代码上,从而忽略了一些很基本的东西,或者说人的精力本来就没有那么多。废话少说,下面来说说我的错误。
1,目标软件的编译需要用到一个包含各种错误信息定义的头文件,然而这个头文件的生成依赖于一个内部开发的小工具,需要用它来编译一个特定格式的文件来产生这个头文件――这是为了在定义错误信息时,在很多人的前后开发过程中,通过工具编译来保持格式和错误信息的协调,避免人工添加带来的错误。我所犯的错误在于,我居然在使用到这个文件里定义的错误信息时,没有把那个头文件给包含进去,呵呵,一个小case的错误,却如此的不堪。
2,写过C、C++程序的人(抱歉,我很难承认那些看过课本写过一些实验程序的人是写过程序的人。)都会了解指针的危险。一个不能正确使用并及时销毁的指针,就像一支冲锋枪,枪口到处乱指。为了避免这个危险,在要求获取指针的时候,我都去检查指针是否被正确获取,如果没有正确获取,则返回一个错误并退出程序。这样的代码检查是如此之多,乃至于我放松了自己的警惕,进入了一种Ctrl+C,Ctrl+V的重复过程。唯一一次出现了一个new的要求,我轻松地重复了上述过程,却没有考虑到,new和delete的一一对应,犹如飞机的起飞次数应该等于降落的次数。当然,对new回来的指针进行检查,如果出错,然后返回,这一点问题也没有,因为这个时候new并没有成功,也就不需要delete来释放分配的堆空间。偶尔,我突然想到,假如在这个new和delete中间,出现了一个指针返回的情况,那我也会一如既往地检查它,这意味着万一它出错,那我将在没有释放堆空间的情况下退出程序,从而造成内存泄漏!在正常的执行过程中,它是不会出错,任何人都很难察觉这个潜在的错误。一旦某一天,错误浮出水面的条件具备了,大家看到的都是莫名其妙的错误,或许系统总是在运行几十天后莫名其妙的当机,谁都很难说明是什么错误,硬件开发人员,软件开发人员,系统工程师,客服人员,顾客相互抱怨,相互纠缠。很恐怖的一件事情。
幸好,在提交代码之前,我察觉了。