• [c/c++]指针(3)


      在指针2中提到了怎么用指针申配内存,但是,指针申配的内存不会无缘无故地

    被收回。很多poj上的题都是有多组数据,每次地数组大小会不同,所以要重新申请

    一块内存。但是原来的内存却不会被收回,也是说2、3组数据玩下去就

    MemoryLimitExceeded,所以需要释放指针指向的内存(只要不是什么黑心评测机,

    把你程序在运行中所有使用过的内存都进算进去就行)

      这里对于C和C++分别有函数和关键字

      C就使用free(void*)函数,参数只有一个,要释放内存的指针,就像这样使用:

    1 #include<stdio.h>
    2 #include<malloc.h>
    3 int main(){
    4     int *p = ( int * )malloc( sizeof(int)*4 );
    5     free(p);
    6     return 0;
    7 }

      至于C++的用户就有一点区别了,delete关键字能够解决这个问题,但是指向的是

    一个数组的话就有点不一样了,试验一下就是到了:

     1 #include<iostream>
     2 using namespace std;
     3 typedef class aaa{
     4     public:
     5         aaa(){ cout<<"a"<<endl;    }
     6         ~aaa(){    cout<<"aaa"<<endl;    }
     7 }aaa;
     8 int main(){
     9     aaa *p = new aaa[3];
    10     delete p;
    11     aaa *p1 = new aaa[3];
    12     delete[] p1;
    13     return 0;
    14 }

      在delete p中,析构函数只被执行了一次,而delete[] p1中析构函数被执行了3次,说明delete

    只是释放单个对象的内存,delete[]是释放指针指向的数组的内存,这仅是对于用户自定义的类型来说。

    对于int等,貌似delete和delete[]差不多

     1 #include<iostream>
     2 using namespace std;
     3 int *p1;
     4 int *p;
     5 int main(){
     6     p = new int[1000000];
     7     
     8     p[0] = 123;
     9     p[1] = 257;
    10     p[2] = 873;
    11     p[99999] = 1;
    12     cout<<p[99999]<<endl;
    13     delete p;
    14 //    cout<<p[99999]<<endl;
    15     
    16     p1 = new int[1000000];
    17     p1[0] = 123;
    18     p1[1] = 287;
    19     p1[2] = 387;
    20     p1[999999] = 1000;
    21     cout<<p[999999]<<endl;
    22     delete[] p1;
    23     cout<<p1[999999];
    24 }

      前面(把注释去掉编译运行)和后面都会崩溃,
    总而言之,为了防止像上例内存没有完全释放的情况,最好用new申请的内存用delete释放

    new[]申请的用delete[]释放

      无论是不是竞赛都要记得用完指针就要释放内存


    指针与结构体

      指针的类型基本上可以是任意数据类型(一个*完事),那访问结构体能不能像这样访问:

     1 #include<iostream>
     2 using namespace std;
     3 struct aaa{
     4     public:
     5         int a;
     6         int b;
     7 }a;
     8 int main(){
     9     aaa *c = new aaa;
    10     c.a = 12;
    11     c.b = 10;
    12     return 0;
    13 }

    于是,编译器报错:

      [Error] request for member 'a' in 'c', which is of pointer type 'aaa*' (maybe you meant to use '->' ?)

      指针不加*是内存地址,内存地址又不是结构体,所以从这上面也能知道这样做是错误的,

    那稍微改一改。用*访问数据:

        (*c).a = 12;
        (*c).b = 10;

      那刚刚编译器中提到的'->'又是什么鬼?这个相当于是(*xx).的缩略方式,于是,之前的代码

    可以写成:

    c->a = 12;
    c->b = 10;

    (注:这个符号只是提供给指向结构体/类的指针访问结构的数据使用,普通结构体不可以使用)

    (第三部分,完)

  • 相关阅读:
    不用循如何计算数组累加和
    mysql通过binlog恢复删除数据
    windows下打开binlog
    mysql的binlog
    枚举实现线程池单例
    AtomicInteger的CAS算法浅析
    不用循环如何计算1累加到100
    MongoDB查询报错:class com.mongodb.MongoSecurityException: Exception authenticating MongoCredential
    Senparc.Weixin微信开发(3) 自定义菜单与获取用户组
    Senparc.Weixin微信开发(2) 消息机制和上下文(Session)
  • 原文地址:https://www.cnblogs.com/yyf0309/p/5671166.html
Copyright © 2020-2023  润新知