栈:当我们定义局部变量时,编译器会将局部变量存储在栈中,当变量作用域结束后,这部分空间会自动释放,以便于后来者使用(这里释放的条件是变量作用域结束,相当于自动释放)
堆:当我们动态分配内存时,编译器会将这块内存放置在堆中,我们可以通过delete或者free来手动释放内存(这里释放的条件是我们写delete来释放,相当于手动操作)
{
int a=10;
int *b = new int;
}
来分析一下:这段代码有两个变量-- a 和 b,还有一块儿动态分配的内存空间(这里是b指针指向的那块)
因为a和b是局部变量,存储在栈中,所以在运行到第四行花括号结束时,会自动释放
而当b被释放后,由于刚刚分配的内存存储在堆中,因此没有被释放,我们就找不到我们分配的那块空间的地址了,这不就没法释放这块空间了,也就造成了内存泄漏
这就是动态分配的内存和自定义变量的区别