【C++008】四区简单介绍

本文介绍了C++中的内存四区——栈、堆、全局(静态)区和程序代码区,包括它们的作用和管理方式。特别讨论了malloc与new的区别,以及内存分配的规则。栈区由编译器自动分配释放,用于存放函数参数和局部变量;堆区由程序员管理,需要手动释放;全局区和静态区存储全局变量和静态变量,程序结束后由操作系统回收。文章还提到了函数内部分配的内存不能在函数外部使用,除非使用malloc。

小例子

例:

int a=123;   //放到栈区
int *p;
p=&a;         //这是执行的,放到代码区

malloc 和 new 的区别

malloc 手工分配的内存是申请的堆区,归操作系统管理;若不释放可能会发生内存泄漏。
new 和他一样的使用方法。
二者区别:
内存分配失败时候,返回值不同。
new 内存分配失败时,会抛出 bad_alloc 异常,它不会返回NULL。
malloc 分配内存失败时,会返回 NULL.。

char *p=NULL;
//分配4个字节的内存  这在临时区  也就是栈区
p=(char *)malloc(100);
//这才把p放到堆区
if(p!=NULL){free(p)};

四区的简单介绍

分析:

1.栈区(stack):

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

2.堆区(heap):

一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。

3.全局区(静态区)(static):

全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放.

(常量区):
字符串常量和其他常量的存储位置,程序结束后由操作系统回收。

4.程序代码区:

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

规则1:

在main分配的内存都可以在被调用函数中使用

规则2:

在被调用函数的栈中分配的内存,主函数不可使用 ,因为被调用函数结束调用就释放了,地址里就没内容了,除非放到malloc中才可使用。
例如:

char *l()
{
    char buff [ 30 ] ;
    strcpy ( buff , " asdfsadf " ) ;
    return buff ;
}

(2013编译器提示,返回局部变量或临时变量的地址,函数结束后就清空了这个函数的所有栈中的东西,返回有什么用?又取不出来)
(PS:此处可以理解为 返回值之后 栈区因为被释放,导致数据丢失,然后无法输出栈区之前写的值)

这个函数一旦结束调用, buff 就被清空,除非 malloc,但需要 cstdlib(头文件名称)。

char *buff = (char*)malloc(30 * sizeof(char));

这样才是对的

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
char * kk()
{
    char *buff = (char*)malloc(30 * sizeof(char));
    //char buff[30];
    strcpy(buff, "asdfsdf");
    return buff;
}
void fun()
{
    char* b=kk();
    printf("main123kk:%c\n", b[2]);
}
int main()
{
    fun();
    getchar();
}

引用我看到过最能清晰解释四区如何运行以及其作用的一张图片。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

3Q3qQ

谢谢老板打赏,我将会继续努力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值