跳转至

堆和栈的内存分配

  • 是电脑中的剩余内存
  • 可以通过malloc访问它来获取更多的内存
    • 此时,OS会使用内部函数注册一块内存区域,并且返回指向它的指针
    • 当使用完这一片区域的时候,需要使用free将其交还给OS,使之能被其他程序复用
      • 如果不使用free释放内存,则会导致内存泄漏

  • 栈存储了每个函数创建的临时变量,为局部变量,
    • 函数的每个函数都会压入栈中,并且可以在函数的内部使用
  • 栈的优点:当函数退出的时候,C编译器会从栈中弹出所有的变量来清理,防止了栈上的内存泄漏

清理内存

  • 原则:如果你的变量并不是从malloc中获取的,也不是从一个malloc获取的函数中获取的,那么他在栈上。

  • 关于栈和堆的主要问题:

    • 如果从malloc获取了一块内存,并且把指针放在了栈上,那么当函数退出的时候,指针会被弹出而丢失
    • 如果在栈上存放了大量的数据,则会产生栈溢出并且终止程序
      • 这种情况应该使用malloc,存放在堆中
    • 如果获取了指向栈上变量的指针,并且将其用于传参或从函数返回,接收它的函数会产生段错误
      • 因为实际的数据被弹出而消失,指针也会指向被释放的内存