前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 中堆区内存与栈区内存相互赋值的一些思考

C++ 中堆区内存与栈区内存相互赋值的一些思考

作者头像
耕耘实录
发布2022-05-09 16:17:43
4460
发布2022-05-09 16:17:43
举报
文章被收录于专栏:耕耘实录耕耘实录

一 将堆区分配的数据对象赋值给栈区变量

代码语言:javascript
复制
#include <iostream>

int main() {
    int id = 110;
    int *stack_id = &id;
    int *heap_id = new int(10);
    std::cout<<*stack_id<<std::endl;
    stack_id = heap_id; // 将堆区分配的数据对象赋值给栈区变量
    std::cout<<*stack_id<<std::endl;
    std::cout<<std::hex<<stack_id<<std::endl;
    std::cout<<std::hex<<heap_id<<std::endl;
    delete stack_id;
    stack_id = nullptr;
    return 0;
}

执行结果:

代码语言:javascript
复制
110
10
0x8000284d0
0x8000284d0

stack_id 与 heap_id 占用的内存只需释放一个即可,无需重复释放。

二 将栈区声明的变量值给堆区数据对象

代码语言:javascript
复制
#include <iostream>

int main() {
    int id = 110;
    int *stack_id = &id;
    int *heap_id = new int(10);
    std::cout << *heap_id << std::endl;
    heap_id = stack_id; // 将栈区声明的变量值给堆区数据对象
    std::cout << *heap_id << std::endl;
    std::cout << std::hex << stack_id << std::endl;
    std::cout << std::hex << heap_id << std::endl;
    return 0;
}

执行结果:

代码语言:javascript
复制
10
110
0xffffcbec
0xffffcbec

赋值后堆区地址已在栈区进行分配,原堆区指针无需再次释放。

三 结论

堆区的数据对象与栈区的变量是可以相互赋值的。 堆区内存由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,当声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存。堆区内存由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收。类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的。两种类型的内存地址相互赋值的本质是改变了变量的内存地址的指向。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一 将堆区分配的数据对象赋值给栈区变量
  • 二 将栈区声明的变量值给堆区数据对象
  • 三 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档