内存分配管理

系统中的内存分为栈、堆、全局区、代码区

  1. 栈:由编译器自动分配释放,参访函数的参数值,局部变量,函数栈帧,函数调用过程。
  2. 堆:由程序员自行分配想要的空间大小,C中的malloc等函数,C++中的new
  3. 全局区(数据区):存放的是全局变量和静态变量,初始化的存在一起,未初始化的放一起,程序结束后由系统释放
  4. 代码区:存放函数体的二进制代码。
int tmp1 = 0; //初始化的全局变量(全局区)
static int tmp2 = 1;//初始化的静态变量(全局区)
short *p1; //全局未初始化区
static short *p2;//
int main() 
{
    int b; //栈
    char s[] = "abc"; //栈
    char *p2; //栈
    char *p3 = "123456"; //123456\0在常量区,p3在栈上。
    static int c = 0; //全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);
    //分配得来得10和20字节的区域就在堆区。
    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
    int* tmp = new int(10);//堆区
}

由程序员自行分配管理的动态内存区:堆

C中:malloc、calloc、realloc/free

  • malloc:申请指定字节数大小的内存空间,初始值不确定,返回值类型是(void*)
  • calloc:分配指定大小空间,申请到内存每一位都初始化为0,返回值(void*)
  • realloc:更改之前分配内存空间的大小(增容、缩小),增容后将原内容放到新的中。

C中用到以上函数进行动态内存开辟,有可能失败,所以要进行判空。     释放开辟空间:free,C中的动态内存释放用的是free,free之后将其指针置空。

C++中:new/delete

在C++中,申请动态内存开辟用的是new函数,而对new/delete来说分为操作内置类型和自定义类型。

  • 内置类型:申请释放一段连续的空间,可以用到new int [ ]/delete [ ]  ptr。
  • 自定义类型申请空间:
  1. new的原理:new-----operator new( )-----构造函数,其中operator new底层实现用的是malloc
  2. delete原理:析构函数(完成对资源的清理工作)----operator delete( )
  3. new [N]:调用operator new[ ]( )----N次operator new( )-----N次构造
  4. delete[ ]:N次析构,operator delete[ ]( )中N次operator delete( )

new和malloc的区别:

  1. new申请空间的返回值就是new后面的类型,而malloc等的返回值是void*,需要强转
  2. new申请连续空间给出个数即可,而malloc需用到sizeof()计算
  3. new/delete是操作符,而malloc/free是函数
  4. new申请的空间可以初始化,malloc不行
  5. new可以申请自定义类型和内置类型,而malloc只能申请内置类型。
  6. new申请空间失败时会抛出异常,需要捕获异常,而malloc申请失败返回NULL,需要判空
C语言模拟内存分配管理使用位视图的方法可以通过一个位数组来表示内存的使用情况。假设我们有一个大小为N的内存,我们可以用一个长度为N的位数组来表示每个内存块的占用情况。 1. 初始化位视图:开始时,将位数组中的所有位都设置为0,表示内存中的所有块都是空闲的。 2. 内存分配:当需要分配一块大小为m的内存时,我们可以遍历位数组中的连续m个位,直到找到一个连续的空闲块。将这些位设置为1,并返回内存块的起始地址。如果找不到连续的空闲块,则分配失败。 3. 内存释放:当一块内存不再使用时,我们可以根据内存块的起始地址和大小,将对应的位数组中的位设置为0,表示该内存块已经释放。 4. 内存管理算法:为了提高内存的利用率,可以使用不同的内存分配算法,如首次适应、最佳适应或最坏适应等。这些算法通过遍历位数组来找到适合的内存块进行分配。 使用位视图进行内存分配管理的优点是简单、高效。只需要维护一个位数组,不需要额外的数据结构。同时,也可以快速地判断一个连续的内存块是否空闲。然而,位视图的缺点是不能处理碎片化问题,可能会导致内存的浪费。 总而言之,使用位视图可以模拟内存分配管理,在C语言中实现内存的分配和释放操作。通过维护一个位数组,可以方便地管理内存的使用情况,并选择合适的算法来分配和释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值