技术文章推荐程序员技术栈

编程基础 之 Stack和Heap的区别

2019-03-10  本文已影响0人  V哥的博客

Stack和Heap在哪儿

都在RAM,即都在内存中存放

Stack

在一个函数被调用时候,在stack会保留一块以用来保存local variables。函数返回时,这块stack成为Unuse的状态,提供给下一个函数的使用。

function func(){
  int i = 1; // Allocated on stack
} // De-allocated from stack

function func1(){
  int j = 2; // Allocated on stack
}// De-allocated from stack


void main(){
  func();
  func1();
}

Heap

Heap的分配和释放比较自由,可以随时分配,并且随时释放。

new 和 malloc创建的东西将会存放到Heap中,属于dynamic allocation

function func(){
  int i = 1; // Allocated on stack
  Char* buffer = new Char[20]; // Allocated on heap
  doSomething;
  deallocated buffer; //deallocated from heap
  doSomethingElse;
}//deallocated from stack

Thread中的Stack和Heap的关系

每个thread都有自己的Stack,同一process下的Threads之间共享一个Heap。

通常 一个application只有一个Heap

例子

Stack和Heap的分配

int i = 1; // Allocated on stack
Char* string = "Vigor"; //Allocated on stack
Char* buffer = new Char[20]; // Allocated on heap

int foo()
{
  char * pBuffer;
  //<--nothing allocated yet (excluding the pointer itself, which is allocated here on the stack).
  bool b = true;
  // Allocated on the stack.
  if(b)
  {
    //Create 500 bytes on the stack
    char buffer[500];

    //Create 500 bytes on the heap
    pBuffer = new char[500];

   }
   //<-- buffer is deallocated here, pBuffer is not
} //<--- oops there's a memory leak, I should have called delete[] pBuffer;

使用Stack和Heap时常见的问题

Stack的分配和释放是受到Compiler的控制,同时,Heap的分配和释放是受到Developer的控制(C和C++),所以说Heap的问题出现的会比Stack的问题多

分配时的问题

释放时的问题

Java中,受到GC控制释放,一般不会遇到Heap的问题

Reference

https://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap


想要看到更多玮哥的学习笔记、考试复习资料、面试准备资料?想要看到IBM工作时期的技术积累和国外初创公司的经验总结?

image

敬请关注:

玮哥的博客 —— CSDN的传送门

玮哥的博客 —— 简书的传送门

玮哥的博客 —— 博客园的传送门

上一篇 下一篇

猜你喜欢

热点阅读