#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;
}
执行结果:
110
10
0x8000284d0
0x8000284d0
stack_id 与 heap_id 占用的内存只需释放一个即可,无需重复释放。
#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;
}
执行结果:
10
110
0xffffcbec
0xffffcbec
赋值后堆区地址已在栈区进行分配,原堆区指针无需再次释放。
堆区的数据对象与栈区的变量是可以相互赋值的。 堆区内存由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,当声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存。堆区内存由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收。类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的。两种类型的内存地址相互赋值的本质是改变了变量的内存地址的指向。