【QIUC】第一卷-CC++高级(九)- C++的内存分配

【QIUC】第一卷-C/C++高级(九)- C++的内存分配

栈区(Stack)

栈区(Stack):函数的参数和局部变量存在栈区。函数调用时生成,函数执行完自动释放,只是临时的。

  • 栈帧:当调用一个函数时,就会在栈空间为这个函数,分配一块内存区域,专门给这个函数用。这块内存区域,就叫做“栈帧”。

  • 若内存超出栈帧,就会导致内存溢出

    //运行时将因为栈帧空间溢出,而崩溃
    void test(void) {
          
          
        
        //2M在栈空间里
       char buff[2000000];
       cout <<(int)buff[sizeof(buff)-1];
        //访问数组最后一个成员,在此处崩溃
    }
    
    //这是由于递归函数的多次调用导致的内存溢出
    void test(int n) {
          
          
    	char buff[1024 * 100]; //100K
    
    	printf("n=%d\n", n);
    	printf("%X", buff);
    
    	if (n == 1) return;
    	else test2(n - 1);
    
    
    int main(void) {
          
          
    	test2(20);
    	return 0;
    }
    /*
    n=3
    1F6D1C   //两个地址之间相差100kb,即第三次
    n = 2
    1DD6F8   //两个地址之间相差100kb,即第二次
    n = 1
    1C40D4
    */
    

堆区(Heap)

堆区(Heap):由程序员自己分配,也是动态内存分配区。但是若不进行内存释放,可能会导致内存泄漏。而未释放的内存会持续至main函数结束后操作系统将其进行释放。

全局/静态区

全局/静态区:全局变量和静态变量存储区,但是静态变量在哪定义就在哪调用,且静态变量会储存值。

文字常量区

文字常量区:常量字符串,即字符串常量相同时存放地址相同。

程序代码区

程序代码区:存放函数体的二进制指令

猜你喜欢

转载自blog.csdn.net/qq_51672565/article/details/114751044