C++基础系列五:自增自减操作符、箭头操作符、new和delete操作符

这一章的内容主要来自C++ Primer中文版第四版的第5章。

(1)自增和自减操作符

自增和自减操作符有前置和后置两种形式,前置操作使用的是对象加1后的值,后置操作使用的则是对象加1前的值,推荐使用前置操作符,原因如下:

前置操作返回的是加1后的值,所以返回的是对象的本身,是左值;而后置操作符需要将对象加1,但是还需要保存加1前的值,对于int类型和指针,编译器可优化掉这些额外开销,但是对于复杂的迭代器类型,可能就需要花费很大的代价,如果使用前置操作符,就可以忽略掉这些性能差异。

(2)箭头操作符是为了简化解引用和点操作符

点操作符用来获取类类型对象的成员,如果要通过指向对象的指针获取对象的成员,那么就需要先对指针解引用,然后使用点操作符,如下:

1 class Item { ... };
2 Item* ins = new Item;
3 (*ins).setNum(n);
4 //ins->setNum(n);

对此,可以用箭头操作符进行简化,如上面的代码中第四行所示。

(3)new和delete操作符

对于下面的语句,通过使用new操作符,系统在自由存储区(堆)中分配创建了一个int对象,并返回对象的地址,用该地址初始化指针pi。

int* pi = new int;

动态创建对象时如果不显示初始化,那么对象的初始化同创建动态数组时一样:类类型的对象调用默认构造函数进行初始化,内置类型则无初始化。如:

string *ps = new string;//initialized to empty string
int *pi = new int;//pi points to an uninitialized int

也可以在类型后添加圆括号的方式对动态创建的对象做值初始化:

string *ps = new string();
int *pi = new int();

delete: 动态对象使用完后必须使用delete操作符进行释放,否则自由存储区(堆)就会被耗尽,造成内存泄露。delete之后,还应重设指针的值,这是因为执行语句delete p;之后,p就变成不确定的指针,这样的p称为悬垂指针,也称为野指针,在很多机器上,p仍然指向曾经存放对象的内存,但该对象已被释放,所以使用p可能会导致程序错误,而且很难检测出来,所以应在使用p之前重设它的值。

延伸:野指针是指指针指向了不合法的、无效的内存空间,造成野指针的原因主要有三个:

a. 指针未初始化;

b. 指针指向的内存通过delete或free释放掉后没有重设指针的值;

c. 指针操作超越了变量的作用范围。

对指向同一内存空间的两个指针进行delete会破坏自由存储区。

原文地址:https://www.cnblogs.com/sophia-yun/p/3154994.html