内存管理机制(2020-02-16)

2020-02-16  本文已影响0人  _NewMoon

在学习静态成员的时候,不少知识点设计到了内存这一块,之前在学习C语言和数据结构的时候也在这一块遇到了不少迷惑,今天就打开这扇门,一探究竟,持续补充~

对一个程序来说,它会占用哪些内存:

静态区/全局数据区:

用来存放全局变量、静态全局变量、静态局部变量。在程序结束后由系统回收。
这个区域可以可能分成以下内存区域(查了一些资料,用了汇编原理来介绍此块,目前仅作了解):

文字常量区

用来存放常量字符串,程序结束后由系统自动释放。

程序代码区

用来存放函数体的二进制代码。

栈(stack)

存放函数的参数名,局部变量的名,由编译器自动分配释放。

堆(heap)

存放动态分配的内存,如用malloc和new动态分配的内存,由程序员自己释放,如free和delete,如果程序员不释放(warning!可能会造成内存泄露),程序结束后系统可能会对其回收。

下面以几行代码来认识上述的几个区域:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

static int a = 1;  //存放在全局数据区(初始化区)

int b;             //存放在全局数据区(未初始化区,会被自动清0)

int main()
{
    int c = 0;     //存放在栈区
    
    char d[100] = "helloworld";  //"helloworld"存放在常量区,s存放在栈区
    
    int* e = (int*)malloc(10*sizeof(int)); //申请的空间存放在堆区
    
    int* f = new int [10]; //申请的空间存放在堆区
    
    static int g = 0;   //存放在全局数据区(初始化区)
    
    return 0;
}
从网络上找了两张图,我觉得非常形象: 1.图源网络
2.图源网络

接下来对这些区域的相关知识再作补充:

栈(stack)和堆(heap)

-3. ....


先写到这,本想举一个栈向下生长和堆向上生长的例子,但是我发现再网页上和VS上的结果不一样,网上暂时没查询到有效的信息,暂时记录一下,另外,关于"段"的知识还没有学习过,但是涉及到内存,肯定时绕不过的,慢慢补充吧,学无止境嘛!
2020年2月16日


上一篇 下一篇

猜你喜欢

热点阅读