第七章 内存管理
7.2常见的内存错误及其对策
*内存未分配成功却使用了它:
在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查 ;如果使用malloc或者new来申请内存,应该用if(p==NULL)或if(p!=NULL)进防错处理。
*无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。
*内存分配成并且已经初始化,但操作越过了内存的边界。
*内存泄露。动态内存的申请与释放必须配对,申请与释放的次数一定要想同。
*释放了内存却继续使用它(三种情况):
(1)对象调用关系过于复杂。应重新设计数据结构,解决对象管理混乱局面
(2)函数注意不要返回指向“栈内存”的“指针”或者“引用”,该内存在函数体结束时会被销毁
(3)使用free或delete释放了内存后,没有将指针设置为NULL。导致产生“野指针”。
7.3指针与数组的对比
*数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在声明周期内保持不变,只有数组的内容可以改变。
7.3.1修改内容
企图修改常量字符串的内容导致运行错误。
7.3.2内容复制与比较
对数组进行复制:strcpy();
对数组进行比较:strcmp();
//指针
int len=strlen(a);
char *p=(char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); //不要用p=a,
if(strcmp(p,a)==0) //不要用if(p==a),那是比较地址
7.3.3计算内存容量