未定义行为

 

很多地方出现未定义行为,可每每当它出现时,我们都不知道它是一个未定义行为,或者只是单纯的理解成一个错误。使用未定义行为直接带来的后果是:编译器碰到此类情况可以为所欲为。

人类的恐惧来自对一个事物的无知,但追求问题解的过程又充满了痛苦。所以在追求把所有的未定义行为都总结出来这个过程中,发现很难,也根本没有办法能一个一个进行解释。但为了让我们更严谨的写程序,我又十分的想把未定义行为总结全。

 

什么是未定义行为,引用标准委员会的解释:“使用了某些错误程序行为或者错误数据都会产生未定义行为。当ISO标准没有对任何具有明显定义的行为进行描述时,也将导致未定义的行为。【注:可能的未定义的行为包括完全忽略产生不可预测结果的情况,这些行为在编译或程序执行时产生环境特定的,有文档描述的行为(可能同时发布出诊断消息),或者直接终止编译或执行(并发布诊断消息)。许多错误的程序构造不会造成未定义行为,这样的程序就需要被诊断。】“

 

可能上面的定义比较晦涩难以理解,我想用白话说说,第一、使用错误程序代码或者错误的数据(如下面讲的使用未初始化数据)都将导致未定义行为。第二、标准委员会明确定义出来某些行为是未定义行为,在ISO C++标准里有描述。第三、如果标准委员会的文档里没有定义出来,但已经具有某种意义的程序代码或者说程序行为,那么它也被认为是未定义的。

 

有可能上面的解释还是不够直接,那么搜集了一些常见的未定义行为:

²        读取一个未初始化的值会引起未定义行为;

²        对于越界的类型赋值会引起未定义行为;

²        连接一般的字符串 literal 和宽字符串 literal 的结果是未定义行为;

²        创建空引用致在运行期发生未定义的行为;

²        任何对一个未实现的纯虚函数的直接或间接调用都会导致未定义行为;

²        对一个非 new 返回的指针使用 delete 是未定义行为;

²        异常离开析构函数是未定义行为

²        继续添加中……

猜你喜欢

转载自blog.csdn.net/wry2008wry/article/details/6718381