C/C++动态内存管理
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; }