C语言基础-内存申请和释放

在C语言中,malloc 和 free 是用于动态内存分配和释放的函数。而在C++中,new 和 delete 提供了类似的功能,但它们之间有一些重要的区别。

1. malloc 和 free

malloc

malloc 函数用于在堆上动态地分配指定字节数的内存。它的原型在 stdlib.h 头文件中定义如下:

void *malloc(size_t size);
  • size:要分配的字节数。
  • 返回值:一个指向已分配内存的指针,如果内存分配失败则返回 NULL

使用 malloc 分配的内存块需要手动初始化,因为它只是分配了内存但没有初始化它。

free

free 函数用于释放之前使用 malloccalloc 或 realloc 分配的内存块。它的原型在 stdlib.h 头文件中定义如下:

void free(void *ptr);
  • ptr:指向要释放的内存块的指针。

当调用 free 后,指针本身并不会自动设为 NULL,因此为了避免悬挂指针(dangling pointer),最好手动将指针设为 NULL

2. new 和 delete

new

在C++中,new 运算符用于在堆上动态地分配内存并初始化对象。它的用法如下:

T* ptr = new T(args);  // 分配并初始化一个类型为T的对象
  • T:要创建的对象类型。
  • args:传递给对象构造函数的参数(如果有的话)。
  • 返回值:一个指向新创建对象的指针。

使用 new 分配的对象会自动调用构造函数进行初始化。

delete

delete 运算符用于释放之前使用 new 分配的内存块,并调用对象的析构函数。它的用法如下:

delete ptr;  // 释放ptr指向的内存,并调用其析构函数
  • ptr:指向要释放的内存块的指针。

当调用 delete 后,指针本身并不会自动设为 nullptr(C++11及以后版本推荐使用 nullptr 而不是 NULL),因此为了避免悬挂指针,最好手动将指针设为 nullptr

3. malloc/free 与 new/delete 的区别

  1. 类型安全new 和 delete 是类型安全的,它们知道正在处理的对象类型,因此会调用相应的构造函数和析构函数。而 malloc 和 free 只是分配和释放内存,不知道对象的类型,因此不会调用构造函数或析构函数。
  2. 初始化:使用 new 分配的对象会自动调用构造函数进行初始化,而 malloc 分配的内存块需要手动初始化。
  3. 异常安全性new 在内存分配失败时会抛出 std::bad_alloc 异常,而 malloc 在内存分配失败时会返回 NULL
  4. 返回值malloc 返回一个 void* 类型的指针,需要手动进行类型转换;而 new 直接返回对应类型的指针。
  5. 语法new 和 delete 是C++的运算符,具有更简洁的语法;而 malloc 和 free 是C语言库函数,需要包含相应的头文件。
  6. 内存泄漏:无论是使用 malloc/free 还是 new/delete,如果忘记释放分配的内存,都会导致内存泄漏。因此,在使用这些函数和运算符时,需要格外小心。
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿部春光

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值