• c++指针存储应用程序和释放内存的问题


    C++中指针在new和delete操作的时候对内存堆都做了些什么呢。下面解:

    1、指针的new操作:

    指针在new之后,会在内存堆中分配一个空间。而指针中存放的是这个空间的地址。如:

    void main(){
     int *p = new int(4);
     cout << p << endl;
     cout << *p << endl;
    }
    输出为:
    0x00431BF0
    4

    分别为分配的空间地址和地址内存放的值。

    假设写为:

    void main(){
     int *p = new int(4);
     cout << *(int *)0x00431BF0 << endl;
    }
    输出为:4

    程序的意思就是将0x00431BF0内存地址開始的4个byte的块取出转换为int类型输出。即直接读取内存。

    2、指针的delete操作:

    指针在delete的时候。会将指针指向的内存区域释放掉,而指针同内存区域的联系并没有被切断,仍然会仅仅想原来指向的内存区域。如:

    void main(){
     int *p = new int(4);
     cout << p << endl;
     cout << *p << endl;
     delete p;
     cout << p << endl;
     cout << *p << endl;
    }

    程序输出:
    0x00431BF0
    4
    0x00431BF0
    -572662307

    能够看到p前后指向的地址是同样的,而指向地址的内存区域被释放。

    3、空指针:

    空指针指向的内存区域为内存的首地址,是不可读写的区域,即空指针不提供操作。删除空指针是安全的(由于它什么也没做)。所以,在写构造函数,
    赋值操作符。或其它成员函数时,类的每一个指针成员要么指向有效的内存,要么就指向空,那在你的析构函数里你就能够仅仅用简单地delete 掉他们。而不用
    操心他们是不是被new 过。如:

    void main(){
     int *p = NULL;
     cout << p << endl;
    } //输出0x00000000

    4、取出内存区域的值

    在取某内存地址開始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte。char为1个byte。程序如:

    void main(){
     int a[2] = {261,0};
     int *pi = a;
     char *p = (char*)pi;
     cout << *(int *)p++ << endl;  //取出p地址,转化为取4个byte,并取出内容。之后p向后移动一位
     cout << *(int *)p << endl;    //取出p地址,转化为取4个byte,并取出内容
     cout << (int)*p << endl;      //取出1个char类型,并转换为int型
     cout << (int)*(char *)pi << endl;  //取出pi地址。转换为char类型,取出内容,并转换为int型
    }
    程序输出:
    261
    1
    1
    5

    a的存储区域安排为:byte1=5,byte2=1,byte3~byte8 = 0;
    所以*(int *)p++取的为byte1到byte4。 之后的*(int *)p取的是byte2到byte5。
    (int)*p取的它是byte2;(int)*(char *)pi就拿byte1,在转换到后int类型

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    凹凸函数
    HashMap数据类型使用注意不能使用基本数据类型
    Tomcat部署发布JSP应用程序的三种方法
    Ubuntu忘记密码,进不了系统的解决方法
    matlab之运算符及其优先级
    java和tomcat配置
    MySQL中 MySQL X.X Command Line Client 一闪而过
    Pearson(皮尔逊)相关系数
    CG, DCG, NDCG
    C#中ListBox中SelectedItem使用注意
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4799899.html
Copyright © 2020-2023  润新知