第七章 内存管理 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计算内存容量
|