C 语言动态内存管理
申请内存的方式
栈上 (静态内存管理)
1. 生命周期随栈帧. 栈帧结束, 内存归还给操作系统, 无需程序猿管理.
2. 空间开辟的大小固定, 申请数组时数组的大小必须指定. 他内存在编译时期就已经分配好.
3. 程序在运行时期不能进行内存申请. 而这种情况在编程中又很常见. 所以就需要动态内存管理.
堆上 (动态内存管理)
1. 生命周期由程序猿管理. 需要手动申请手动释放. 且必须释放, 否则就会造成内存泄露
2. 开辟空间大小由程序猿指定, 更灵活. 空间分配在程序运行期间分配.
对比: 栈上申请内存比较省心, 规规矩矩. 缺乏灵活性, 而堆上申请内存更为灵活. 但是灵活也就意味着风险. 如果只申请, 不释放, 就会造成内存泄露. 释放的内存的申请的内存要匹配.
- int *p = (int *)malloc(20*sizeof(int));
- int *pp = (int *)calloc(20, sizeof(int));
- int i;
- printf("malloc 申请的空间值:\n\n");
- for ( i=0 ; i <20; i++)
- {
- printf("%d", *p++);
- }
- printf("\n\n");
- printf("calloc 申请的空间的值:\n\n");
- for ( i=0 ; i < 20; i++)
- {
- printf("%d", *pp++);
- }
- free(p);
- free(pp);
- class Array
- {
- public:
- Array(size_t size=10)
- :_size(size)
- ,_a(0)
- {
- cout<<"Array(size_t size)"<<endl;
- if(size>0)
- {
- _a=new int[size];
- }
- }
- ~Array()
- {
- cout<<"~Array()"<<endl;
- if(_a)
- {
- delete[]_a;
- _a=0;
- _size=0;
- }
- }
- private:
- int * _a;
- size_t _size;
- };
- int main()
- {
- Array* p1=new Array;
- delete p1;
- Array* p2=new Array[5];
- delete []p2;
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3357587.html