C++ malloc & free、new & delete

一、malloc & free

malloc函数用于动态分配内存,它的原型为 void* malloc(size_t size)。它返回一个指向连续内存块的指针,该内存块的大小至少为size字节,如果无法分配请求的大小,则返回NULL。

free函数用于释放动态分配的内存,它的原型为 void free(void* ptr)。它将指向动态分配的内存块的指针ptr作为参数,并将该内存块释放,使其可供后续的动态分配。

使用malloc & free时需要注意以下几点:

  • malloc分配的内存空间必须显式释放,否则会导致内存泄漏。
  • malloc分配的内存空间是连续的,可以通过指针进行访问。
  • malloc分配的内存空间不会被初始化,可能包含未知的数据。

示例代码:

int* p = (int*)malloc(sizeof(int)); // 动态分配4字节的内存空间
*p = 10; // 对分配的内存空间进行赋值
free(p); // 释放动态分配的内存空间

二、new & delete

new运算符用于动态分配内存,并调用指定的构造函数进行初始化,它的语法为 new Typenew Type(Args...)。new运算符返回一个指向Type类型的指针,如果无法分配请求的大小,则会抛出std::bad_alloc异常。

delete运算符用于释放通过new运算符分配的内存,并调用指定的析构函数进行清理,它的语法为 delete ptr。delete运算符将指向Type类型的指针ptr作为参数,并释放该指针所指向的内存空间。

使用new & delete时需要注意以下几点:

  • new分配的内存空间必须显式释放,否则会导致内存泄漏。
  • new分配的内存空间是连续的,可以通过指针进行访问。
  • new运算符会调用指定类型的构造函数进行初始化,delete运算符会调用指定类型的析构函数进行清理。
  • new运算符和delete运算符是成对使用的,不要混用。

示例代码:

int* p = new int(10); // 动态分配4字节的内存空间并初始化为10
delete p; // 释放动态分配的内存空间

相同点:

  1. 都是用来动态分配和释放内存的函数。
  2. 分配出来的内存都位于堆区。
  3. 都需要手动释放内存。

区别点:

  1. malloc & free 是C语言提供的标准库函数,new & delete 是C++语言提供的操作运算符。
  2. malloc & free 分别只能用于分配和释放内存,new & delete 不仅可以分配和释放内存,还可以调用构造函数和析构函数。
  3. malloc申请空间时,需要手动指定内存大小;new 在使用时不需要指定分配内存的大小,编译器会自动计算并分配所需大小的内存。
  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型。
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常(底层区别)。
  6. malloc申请的空间不会初始化,new可以初始化。
  7. new & delete 可以被重载,以实现自定义内存分配和释放策略,而malloc & free 不可以被重载。

区别:

1. 对象类型的自动识别:

在使用 new 操作符时,编译器会自动识别对象的类型,并根据其所需内存大小为其分配内存空间,并返回一个指向该对象的指针;而在使用 malloc 函数时,我们需要手动指定所需内存空间的大小,且 malloc 函数分配的内存空间都是 void 类型的指针,需要通过强制类型转换后才能使用。

2. 构造和析构函数的执行:

使用 new 操作符动态地分配一个对象的内存空间时,还会自动调用该对象的构造函数进行初始化操作,而 delete 操作符会自动调用对象的析构函数进行内存回收;而使用 malloc 分配内存空间时,我们需要手动调用对象的构造函数进行初始化以及手动调用析构函数进行内存释放。

3. 内存泄漏风险:

使用 malloc/free 命令进行动态内存分配时,有可能会忘记调用 free 函数进行内存释放,从而导致内存泄漏;而使用 new/delete 操作符时,我们只需要关注对象的创建和销毁,编译器将会自动处理内存的分配与释放。

4. 适用范围:

new/delete 操作符 mainly 用于 C++ 的类对象动态内存分配和销毁,而 malloc/free 函数则更具通用性,可以用于任何类型的动态内存分配。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值