C++学习笔记11:内存相关 new/delete malloc/free

内存管理

a、 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量、常量
b、 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限。
c、 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存。

数据段存放内容特点
BSS程序中未初始化的全局变量静态变量可读写,在程序执行之前BSS段会自动清0。所以未初始的全局变量在程序执行之前已经成0了。
DATA数据段程序中已初始化的全局变量数据段属于静态内存分配。
TEXT代码段程序执行代码区域大小在程序运行前就已经确定,通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中也有可能包含一些只读的常数变量,例如字符串常量等。
HEAP堆进程运行中被动态分配的内存段大小不固定,可动态扩张或缩减。malloc/new(堆被扩张)free/delete(堆被缩减)
STACK栈/堆栈程序临时创建的局部变量函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。堆栈看成一个寄存、交换临时数据的内存区
  • 堆和栈的区别
    a、申请方式不同。栈上有系统自动分配和释放;堆上有程序员自己申请并指明大小;
    b、栈是向低地址扩展的数据结构,大小很有限;堆是向高地址扩展,是不连续的内存区域,空间相对大且灵活;
    c、栈由系统分配和释放速度快;堆由程序员控制,一般较慢,且容易产生碎片;
  • 全局变量和局部变量有什么区别?怎么实现的?操作系统和编译器是怎么知道的?
    a、生命周期不同:
    全局变量随主程序创建和创建,随主程序销毁而销毁
    局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;内存中
    分配在全局数据区
    b、使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用,分配在栈区
    操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面。
  • 局部变量和全局变量是否可以同名?
    能。局部会屏蔽全局。要用全局变量,需要使用”::”(域运算符)。
  • static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?
    static全局变量与普通全局变量区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
    static局部变量和普通局部变量区别:static局部变量只被初始化一次,下一次依据上一次结果值;

new/delete和malloc/free的区别和联系

两大区别:
第一:malloc和free是函数,需要包含相关头文件,new和delete是操作符
第二:new和delete除了分配释放堆内存之外,还调用了构造函数和析构函数

new/delete都是要分两步操作的:new分配内存,并且调用对象的构造函数初始化一个对象;delete调用相应的析构函数,然后释放内存
malloc/free只是分配内存/回收内存,
malloc需要头文件"stdlib.h"或者"malloc.h";
在C++中依赖brk()系统调用增长堆空间?

new/delete都是内建的操作符,而malloc是一个函数,其函数原型是:
void *malloc(unsigned int num_bytes);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值