c++内存简介

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。而我们需要重点关注的就是堆和栈。

  1. 栈内存,在函数内部局部变量申请的内存,会自动释放;申请释放速度快;向地址减小的方向增长。
  2. 堆内存,使用new、malloc申请的内存,需要手动delete、free;效率低于栈,频繁的new/delete、malloc/free会产生内存碎片导致效率降低;向地址增大的方向增长。

1、内存常见错误:

  1. 内存分配未成功,却使用了它。使用assert(p!=NULL)检查。
  2. 内存分配虽然成功,但是尚未初始化就引用它。
  3. 内存分配成功并且已经初始化,但操作越过了内存的边界。内存越界,一般是访问了申请内存外的区域或访问了释放后的内存。
    char *tmpc=new char[len-1]; //申请len-1大小的内存
    memset(tmpc,0,len);//填充了len大小
    这里的越界填充可能会填充到其他定义的数据结构的内存地址去,导致另一个数据结构的对象异常,问题难以排查。
  4. 忘记释放内存,释放了却再次使用。

2、内存使用关键点。
a、函数return栈内存。解决办法,使用string或者指向堆内存指针的指针来替换所需要return的栈内存。
void GetM(char **p, int num){
p = (char )malloc(sizeof(char) * num);
}
char* str = NULL;
GetM(&str, 100);
free(str);

b、不能用修改数组的方式去修改指针。
c、new、malloc申请内存后要初始化;使用前需判断NULL;使用结束后用delete、free**释放内存,并置为NULL**。

你可能感兴趣的:(c++,c++,内存常识)