首页 > 编程语言 >C/C++:new/delete与malloc/free的区别

C/C++:new/delete与malloc/free的区别

时间:2024-04-26 21:34:56浏览次数:19  
标签:malloc 函数 C++ free new delete

`new` 和 `delete` 是 C++ 中的关键字,而 `malloc()` 和 `free()` 是 C 语言中的函数。它们在内存分配和释放方面有几个重要区别:

1. **类型安全性**:
- `new` 和 `delete` 是 C++ 中的运算符,它们会自动计算所需的内存大小,并返回正确类型的指针。这意味着你不需要在使用时显式指定类型。
- `malloc()` 返回 `void*` 类型的指针,你需要显式转换为所需的类型。因此,它不提供类型安全性。

2. **构造函数和析构函数的调用**:
- 当使用 `new` 分配内存时,会调用对象的构造函数来初始化对象。而当使用 `delete` 释放内存时,会调用对象的析构函数来清理对象。
- `malloc()` 和 `free()` 不会调用对象的构造函数和析构函数,它们只是分配和释放内存块。

3. **大小参数**:
- `malloc()` 需要你显式提供要分配的内存块的大小,而 `new` 会根据所需类型自动计算所需内存大小。

4. **对数组的支持**:
- `new` 可以用于动态数组的分配,同时 `delete[]` 用于释放数组。它们会正确调用数组元素的构造和析构函数。
- `malloc()` 和 `free()` 不会自动调用数组元素的构造和析构函数,你需要手动管理数组元素的生命周期。

 

用自己话来总结:C中的两个函数侧重于简单粗暴地对内存进行指定的分配和释放,而C++中的两个函数会针对实际使用的对象进行计算大小和调用构造/析构函数

标签:malloc,函数,C++,free,new,delete
From: https://www.cnblogs.com/toriyung/p/18160913

相关文章

  • lib 安装失败,error Microsoft Visual C++ 14.0 is required.
    即使安装c++要占用c盘4G,而且仍然有可能报错,error:command'C:\ProgramFiles(x86)\MicrosoftVisualStudio14.0\VC\BIN\x86_amd64\cl.exe'failedwithexitstatus2另一种解决方法是直接下载whl,省去编译的过程https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib有可能......
  • python C++混合编程环境搭建
    一、python环境1.下载python安装包2.安装python(选择下载符号文件和二进制文件)注:多半会报错“Error0x80072f7d:FailedtosendrequesttoURL:……”,因为下载超时导致安装失败解决:1)手动下载core_pdb.msi等文件https://www.python.org/ftp/python/3.8.0/win32/(选择......
  • ROS2学习--POP方法编写C++节点 debug过程
    一、编写C++节点并测试 1.创建功能包C++功能包使用ament-camke作为编译基础,依赖为rclcpp。打开终端,进入town_ws/src运行下面的指令,目录结构如下ros2pkgcreatevillage_wang--build-typeament_cmake--dependenciesrclcpp2.创建节点village_wang/src下创建一个wang2.cp......
  • 【Qt专栏】C++删除空指针
    简短不看版:最佳实践if(pMyClass) //这里,pMyClass是指向某个类的指针..{deletepMyClass;pMyClass=NULL; //这句不能少}  完全可以....可能有不少人对Delete删除空指针的用法不屑一顾,但在实际运用当中, 却有不少人会犯类似的错误,最典......
  • C++内联函数
    内联函数关键字inline,inline是空间换时间,提高了程序效率但花费了更多空间。举个例子,下面是一段C语言代码:voidfun(inti){returni*2;}intmain(){inta=4;intb=fun(a);}假定以上C文件被编译器编译成的汇编代码如下:_f_int: addax,@sp[-8] ;相当......
  • 编码技巧C++
    编码技巧C++非零都是true在c++环境下不等于0的数值都被认为是true在判断一个值是否为0时以下代码是等效的,但第一种效率更高inti=123;if(i)cout<<"i不为0";if(i!=0)cout<<"i不为0";不需要用到下标的计数循环可以不用for语句intn;cin>>n;while(n--){......
  • C++ 多级继承与多重继承:代码组织与灵活性的平衡
    C++多级继承多级继承是一种面向对象编程(OOP)特性,允许一个类从多个基类继承属性和方法。它使代码更易于组织和维护,并促进代码重用。多级继承的语法在C++中,使用:符号来指定继承关系。多级继承的语法如下:classDerivedClass:publicBaseClass1,publicBaseClass2,...{......
  • 设计带内存分配的C++类需要注意的几点
    初级内存管理:需要在构造函数中分配内存给ptr,并在析构函数中释放内存,以避免内存泄漏。MyClass::MyClass(){ptr=newint;}MyClass::~MyClass(){deleteptr;}深拷贝:如果您需要实现复制构造函数和赋值运算符重载,您需要进行深拷贝,以确保复制后的对象拥有独......
  • C++ 指针与引用的区别
    初学C++指针时,我误以为可以将指针视作对于原始对象的引用,当时还没有接触C++引用的概念,所以犯了概念上的错误,在此澄清一下这两者的区别。在形式上使用 *定义指针变量:int*p;定义的时候可以不初始化。使用& 定义引用:int&r=i;(其中i是另一个变量),定义引用的时候需要......
  • C++ 指针与引用的区别
    初学C++指针时,我误以为可以将指针视作对于原始对象的引用,当时还没有接触C++引用的概念,所以犯了概念上的错误,在此澄清一下这两者的区别。在形式上使用 *定义指针变量:int*p;定义的时候可以不初始化。使用& 定义引用:int&r=i;(其中i是另一个变量),定义引用的时候需要......