在指针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;
(注:这个符号只是提供给指向结构体/类的指针访问结构的数据使用,普通结构体不可以使用)
(第三部分,完)