关于malloc和new区别的讨论


前言

今天在刷题和复习数据结构的时候都涉及到了链表,由于数据结构我看的是C语言版而刷题时用的Cpp,所以在创造新的节点时遇到了两种方法:mallocnew。由于基础知识不牢固,所以就特地看了一下,两者的区别,下面我挑了一些我认为较为常见和重要的区别( 区别并不完全 )


​ 在C++中,内存动态分配可以通过两种方式实现:使用C语言的malloc函数或C++的new运算符。尽管它们都用于分配内存,但在使用方法、功能和内存管理等方面存在显著差异。以下是对两者的简略比较:

1.mallocfree

​ 首先两者的回收内存的关键字不同,先来说mallocfree这一组。

用法

  • malloc 是一个C库函数,用于分配指定字节数的内存。
  • free 是一个C库函数,用于释放之前通过malloc分配的内存。

语法

void *malloc(int size); // malloc的函数声明

#include <cstdlib> // 在Cpp中
#include <stdlib.h>// 在C中

int* array = (int*)malloc(10 * sizeof(int)); // 分配一个长度为10的整形数组
free(array); // 释放内存

​ 由于malloc在函数声明时返回值为void*,所以当我们在使用malloc一般会将其强制类型转化,并且在使用时要标名申请内存的大小。

特点:

  • 返回void*类型的指针,需要手动进行类型转换。
  • 不会调用构造函数或析构函数(C++中的对象初始化和清理需要手动处理)。
  • 分配的内存未初始化,内容为未定义。
  • 主要用于C语言中,在C++中使用malloc可能会丢失C++语言提供的某些特性。

2.newdelete

用法

  • new 是C++中的运算符,用于分配并初始化内存。
  • delete 是C++中的运算符,用于释放内存并调用对象的析构函数。

语法

#include <iostream>

int* array = new int[10]{0}; // 分配一个长度为10的整形数组,并且初始化为0
delete[] array; // 释放内存

​ 使用new来分配空间,可以初始化变量。

特点:

  • 不需要进行类型转换,直接返回指定类型的指针。
  • 自动调用对象的构造函数,确保对象初始化。
  • 与之对应的delete运算符会自动调用析构函数,完成对象清理。
  • 内存分配和释放方式与C++的面向对象特性兼容。

3.区别总结

  1. 类型安全性:
    • malloc 返回void*,需要手动类型转换,可能导致类型不安全。
    • new 不需要类型转换,直接返回对象类型的指针,类型安全。
  2. 初始化和清理:
    • malloc 只分配内存,不调用构造函数,不负责初始化。
    • new 负责调用构造函数,进行对象初始化。
    • free 只释放内存,不调用析构函数,不进行对象清理。( 如指针指向的空间会被释放,但是指针本身不会被释放 ,只有当程序结束时才会释放)
    • delete 会调用析构函数,负责对象清理。
  3. 异常处理:
    • malloc 如果分配失败,返回NULL,需要手动检查。
    • new 如果分配失败,抛出std::bad_alloc异常。
  4. 适用场景:
    • malloc 适用于C语言,或需要与C代码互操作的场景。
    • new 适用于C++中的对象动态分配,更符合C++的面向对象特性。
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值