2、访问一个无效数组索引,下标越界
3、当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果是未定义的。
实际执行时通常发生的是对象的derived成员没有被销毁。
4、在两个异常同时存在的情况下,程序若不是结束执行就是导致未定义行为。
5、释放一个非new分配的内存,或者将相同的指针值释放多次,其行为是未定义的。
6、string s(s2,pos2); // s是string s2从下标pos2开始的字符拷贝,如果pos2>s2.size(),构造函数的行为未定义
7、试图比较两个无关地址是未定义行为
8、对于那些没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为。
int i=0;
cout<<i<<" "<<++i<<endl; // 未定义
// 编译器可能先求++i的值,再求i的值;也可能先求i的值,再求++i的值。注意与print函数的区别。
*beg=toupper(*beg++); // 未定义
9、对有符号数进行左移操作可能会改变符号位的值,因此是一种未定义的行为。移位运算符右侧的运算对象一定不能为负,而且值必须严格小于结果的位数,否则就会产生未定义的行为。
10、使用static_cast将void*转换成其他类型指针,必须确保转换后所得的类型就是指针所指的类型。类型一旦不符,将产生未定义行为。
double d;
void* p=&d;
double *dp=static_cast<double*>(p);
11、const_cast只能改变运算对象的底层const,如果对象本身是一个常量,使用const_cast执行写操作就会产生未定义行为。
12、不要使用get初始化另一个智能指针或为智能指针赋值,否则将会产生两个独立的shared_ptr指向相同的内存,这将产生未定义行为。
13、delete []p;如果忘记[],其行为是未定义的。 删除单一对象的指针加[],其行为也是未定义的。
注:相关教程知识阅读请移步到C++教程频道。










