• 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会破坏自由存储区。

  • 相关阅读:
    指针数组和数组指针的区别 以及数组引用
    自定义触摸事件封装
    Android使用C++截屏并显示
    C++使用binder实例
    C++的友元类和友元函数实例
    使用C++在andrdoid上画贝塞尔曲线
    PowerManagerService分析(一)之PMS启动
    PowerManagerService分析(二)之updatePowerStateLocked()核心
    PowerManagerService分析(三)之WakeLock机制
    PowerManagerService分析(四)之亮屏流程分析
  • 原文地址:https://www.cnblogs.com/sophia-yun/p/3154994.html
Copyright © 2020-2023  润新知