C++内存管理
feng鸽
一点点的成长,最终会成为参天大树.
展开
-
内存分配方式
在C++中,内存分成5个区,分别是堆,栈,自由存储区,全局/静态存储区和常量存储区。栈:函数内的局部变量的存储单元可以在栈上创建堆:由new分配的内存块自由存储区:由malloc等分配的内存块全局/静态存储区:全局变量和静态变量被分配到同一块内存常量存储区:存放常量堆和栈的区别: 管理方式: 对于栈来讲,由编译器自动管理,无需手工控制;原创 2016-11-17 03:01:54 · 197 阅读 · 0 评论 -
常见内存错误
1.内存分配未成功,却使用了它 如果指针p是函数的参数,那么在函数入口处 用 assert(p!=NULL)进行检查 如果是用malloc或new来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理2.内存分配虽然成功,但是尚未初始化就引用它。 一是没有初始化的概念,而是误以为内存的缺省初值全为零,导致引用初值错误(如数组)3.内存分配原创 2016-11-17 03:25:04 · 258 阅读 · 0 评论 -
指针与数组的比较
数组要么在静态存储区被创建(如全局数组),要么在栈上呗创建。数组名对应一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针随时指向任意类型的内存块,特征是“可变”,常用指针来操作动态内存。‘特性比较:1.修改内容:char a[]="hello";a[0]='X';coutchar* p="world";原创 2016-11-17 03:30:12 · 195 阅读 · 0 评论 -
指针参数是如何传递内存的
如果函数的参数是一个指针,不要指望用该内存去申请动态内存void GetMemory(char * p ,int num){ p=(char*)malloc(sizeof(char)*num);}void Test(void){ char* str=NULL; GetMemory(str,100); strcpy(str,"hello");}原创 2016-11-17 04:11:02 · 209 阅读 · 0 评论 -
杜绝“野指针”
“野指针”不是NULL指针,是指向“垃圾”内存的指针。野指针的成因主要有两种:1)指针变量没有被初始化。 指针刚被创建时不会自动初始化为NULL指针,缺省值是随机的。 在创建的同时应该被初始化,要么设置为NULL,要么让它指向合法的内存. 如: char* p=NULL; char * str=(char*) malloc(原创 2016-11-17 21:18:04 · 199 阅读 · 0 评论 -
malloc/free 和new/delete
对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象创建时同事要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc是库函数不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的人物强加于malloc/free。不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete.由于内部数据类型的“对象”没原创 2016-11-17 21:46:04 · 205 阅读 · 0 评论 -
内存耗尽怎么办?
如果申请动态内存时找不到足够大的内存块,malloc 和new将返回NULL指针,宣告内存申请失败.处理"内存耗尽"的问题1)判断指针是否为NULL,如果是则马上用return语句终止本函数。void Fun(void){ A *a =new A;if(a==NULL){ return ;}}2)判断指针是否为NULL,如果是马上用exit(原创 2016-11-17 23:14:30 · 468 阅读 · 0 评论