栈:通常存放局部变量、函数参数等,编译器自动分配内存,自动清除。向下、向低地址方向增长。是连续的内存区。
变量引用容易逃逸。
堆:new分配的内存块,程序员释放(delet),存放的是实体(对象)。向上、向高地址方向增长。不连续的内存区(系统用链表存储空间内存地址),容易产生memory leak。大量的new/delet会造成内存空间的不连续。
存放在栈中的情况:
int n;
int *n;
char str[]="safsdf";
char *s="asdfasdf";
使用malloc函数分配堆内存:
分配100个int类型的空间:
int *p;
p = (int *)malloc( sizeof(int) * 100 );
free之后要将指针置为空
仅仅将指针free掉会使得指针变为野指针,它的地址仍然不变,只是该地址对应的内存是垃圾,不把它置为NULL,会误以为是一个合法的指针,如下所示:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p 所指的地址仍然不变
…
if(p != NULL) // 没有起到防错作用
{
strcpy(p, “world”); // 出错
}