[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;

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

(第三部分,完)

posted @ 2016-07-14 17:37  阿波罗2003  阅读(241)  评论(0编辑  收藏  举报