C++动态内存

堆栈
堆(heap)和栈(stack)是计算机内存中两种不同的内存分配区域,用于存储程序运行时的数据。
  1. 堆(Heap)

    • 动态分配的内存区域:堆是一种动态分配的内存区域,程序员可以在运行时通过特定的函数(如 newmalloc())来动态地分配内存。

    • 分配和释放由程序员管理:堆上的内存分配和释放是由程序员手动管理的,需要程序员调用相应的函数来分配和释放内存。因此,堆上的内存管理更加灵活,但也更容易出错。

    • 生命周期不受限制:堆上分配的内存的生命周期不受限制,直到显式释放或程序结束时才会释放。

    • 大小不固定:堆上的内存空间大小不固定,可以根据需要动态地增加或减少。

    • 碎片化问题:频繁的堆内存分配和释放可能会导致堆内存的碎片化问题,降低内存利用效率。

  2. 栈(Stack)

    • 自动分配的内存区域:栈是一种自动分配的内存区域,用于存储函数调用的上下文信息、局部变量和临时数据。

    • 分配和释放由编译器自动管理:栈上的内存分配和释放是由编译器自动管理的,无需程序员手动干预。栈内存的分配和释放遵循函数的调用和返回,具有确定性。

    • 生命周期受限于函数调用:栈上分配的内存的生命周期与函数调用的生命周期密切相关,当函数调用结束时,栈上的局部变量会被自动销毁。

    • 大小有限:栈上的内存空间大小通常是有限的,并且受到操作系统或编译器的限制。

C++ 动态内存

在C++中,动态内存是在程序运行时分配和释放的内存,通常位于堆(heap)中。与栈(stack)上的内存分配不同,动态内存分配不需要在编译时知道内存大小或生命周期。动态内存的分配和释放是通过一组特殊的运算符和函数完成的。

在C语言中我们可以使用malloc()函数和free()函数进行内存的申请和释放,而在C++中我们则是用到两个运算符new和delete。

newdelete 运算符**:

new 运算符用于在堆上动态分配内存,并调用对象的构造函数来初始化对象。delete 运算符用于释放通过 new 分配的内存,并调用对象的析构函数来销毁对象。

char * szBuffer = new char[100];  //申请内存
memset(szBuffer, 0, 100);   //将内存中的值改为0
delete szBuffer;    //释放

此时内存中的值都被修改为0

释放资源后内存中的值:

malloc和new

newmalloc() 都是用于在程序运行时动态分配内存的方法,它们之间存在一些联系:

  1. 内存分配

    • newmalloc() 都可以用于在堆(heap)上动态分配内存。

    • new 用于在堆上动态分配对象的内存,它可以调用对象的构造函数进行初始化,并返回指向对象的指针。

    • malloc() 用于在堆上动态分配原始的、未初始化的内存块,它返回一个指向分配内存区域的指针,不涉及对象的构造和初始化。

  2. 用法

    • new 是 C++ 中的一个运算符,而 malloc() 是 C 语言标准库中的一个函数。

    • new 可以自动计算所需内存的大小,而 malloc() 需要显式地指定要分配的内存大小。

    • new 返回的指针类型是根据分配的对象类型确定的,而 malloc() 返回的是 void* 类型的指针,需要手动进行类型转换。

  3. 内存释放

    • 使用 new 分配的内存应该使用 delete 运算符来释放,或者使用 delete[] 运算符释放数组内存。

    • 使用 malloc() 分配的内存应该使用 free() 函数来释放。

C中使用malloc free进行内存的申请和释放。

free和delete

  1. 用法

    • free() 是 C 语言标准库中的函数,用于释放使用 malloc()calloc() 分配的内存。

    • delete 是 C++ 中的关键字,用于释放使用 newnew[] 分配的内存。

  2. 类型

    • free() 函数的参数是一个指向动态分配的内存区域的指针,它的类型是 void*

    • delete 操作符是一个关键字,用于释放使用 newnew[] 分配的对象或数组的内存,它的参数是一个指向对象或数组的指针。

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值