程序运行前:

程序运行后:

栈区:

栈区:由编译器自动分配释放,存放函数的参数值,局部变量.
注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放
有的人会发现我返回局部变量的地址,用一个指针接收,不论多少次,我都可以正确地输出里面的值,那是因为你的这一块内存依然是被保留的,直到下一次被其他需要用到这块内存区域的内容所覆盖,那么你的这个局部变量的内容就被覆盖了,所以并不是说马上会被释放,而是为了性能没有马上删除你这个局部变量的内容.

“`cpp
int * func(int a){
int a = 10;
return &a; //这样返回局部变量的地址是危险的行为,因为这个内存地址是会被系统回收覆盖的
}

<pre><code class="line-numbers">### 堆区:
堆区由程序员分配释放,若程序员不释放,程序结束时由操作系统回收.
在C++中主要使用**new**关键词在堆区开辟内存
“`cpp
int * func(int a){
// 指针的本质,也是局部创建的,也是一个局部变量,这里是局部的变量,是放在栈上的.这里的指针保存的数据是new出来的,数据保存在堆区
int * p = new int(10); //开辟堆区内存,new返回的是一个内存地址 用指针来接收他
return p; //这样返回局部变量的地址是危险的行为,因为这个内存地址是会被系统回收覆盖的
}

int main(){
int *p = func();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
}

堆区的内存编号,用我们创建的栈区的p指针接收了.当你解引用的时候,是会拿到10这个数字的.
保存的是堆区的地址,返回的也是堆区的地址
不论在main里你cout多少次,依然可以正确的输出10,但是你可以发现,p保存的内存地址一直在变,不过10这个数字依旧有效.

发表回复

后才能评论