C++中malloc与free、new与delete的详解与应用

C++面试经常会问到关于malloc/free和new/delete的区别,网上有不同版本的解释,这里总结下并加上个人理解和使用。

两者相同点

  • 1.都可以申请动态堆内存。

两者不同点

  • 1.new/delete是C++的操作符,malloc/free是C/C++的标准库函数。
  • 2.new申请的可以理解为对象,new时会调用构造函数,返回指向该对象的指针,delete时调用析构函数;malloc申请的只是内存,不是对象。
  • 3.new/delete是保留字,不需要头文件支持;malloc/free需要头文件库函数支持。

注意事项

  • 1.用new申请的内存,必须用delete释放。
  • 2.用new[]申请的内存,必须用delete[]释放。
  • 3.delete释放内存后,指针值不变,良好的风格是释放后指针置为NULL,如,delete p; p = NULL。
  • 4.用malloc申请的内存,必须用free释放。

使用

#include "stdafx.h"
#include <stdio.h>
#include "stdlib.h"
#include <string.h>
struct Stu
{
 char name[32];
 int age;
};
int main()
{
/**************************** 基本用法 **********************************/
 //申请一个int类型
 int *p1 = new int; //直接申请赋值 int* p1 = new int(3);
 int *p2 = (int*)malloc(sizeof(int));
 //申请一个char类型
 char *p3 = new char; //直接申请赋值 char *p3 = new char('c');
 char *p4 = (char*)malloc(sizeof(char));
 //申请一个int型一维数组
 int *p5 = new int[5]; //直接申请赋值 int *p5 = new int[5]{1,2,3,4,5};
 int *p6 = (int*)malloc(sizeof(int)*5);
 //申请一个char型一维数组
 char* p7 = new char[6]; //直接申请赋值 char* p7 = new char[3]{'a', 'v', 'c'};
 char* p8 = (char*)malloc(sizeof(char)*6);
 //申请一个int型二维数组
 int(*p9)[2] = new int[2][2]; //直接申请赋值 int(*p9)[2] = new int[2][2]{ 1,2,3,4 };
 int(*p10)[2] = (int(*)[2])malloc(sizeof(int)*2*2);
 //申请一个char型二维数组
 char(*p11)[2] = new char[2][2];
 char(*p12)[2] = (char(*)[2])malloc(sizeof(char)*2*2);
/***************************** 申请二级指针内存 **********************************/
 //申请二级指针(new,delete)
 char** p13 = new char*[2];
 p13[0] = "aaaaaaaaaa";
 p13[1] = "vvvvvvvvvv";
 delete p13;
 //申请二级指针(malloc, free)
 char** p14 = (char**)malloc(sizeof(char*)*2);
 p14[0] = "cccccccc";
 p14[1] = "dddddddd";
 delete p14;
/****************************** 申请结构体内存 *********************************/
 //new delete
 Stu* pStu1 = new Stu;
 Stu* pStu2 = new Stu{"wpf", 10};
 Stu* pStu3 = new Stu[1024];
 delete pStu1;
 delete pStu2;
 delete[] pStu3;
 //malloc free
 Stu* pStu4 = (Stu*)malloc(sizeof(Stu));
 memset(pStu4, 0, sizeof(Stu));
 free(pStu4);
 getchar();
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C++ 中malloc()和free()函数的理解

    C++ 中malloc()和free()函数的理解 关于malloc和free这两个函数,malloc的用法示例:int *p=(int *)malloc(2*sizeof(int)); 它表示在堆中开辟一块大小为2*sizeof(int)的一块内存空间,p指向这块内存空间的起始地址,malloc前面的(int*)表示这块空间用来存储int型数组.开辟了这块空间后,可以修改这个空间中的值,例如为*p,*(p+1)做赋值操作,如果再次使用malloc函数,例如再写一个 int *q=(int *)

  • C++中new与delete、malloc与free应用分析

    一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了.本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析一下,供大家参考. 一.new和delete new和delete是C++的运算符,用于动态分配内存和释放内存. 1.new表达式 标准库定义了operator new函数的几个重载版本,没有使用noexcept说明的版本在内存分配失败时可能会抛出bad

  • C++中new和delete的使用方法详解

    C++中new和delete的使用方法详解 new和delete运算符用于动态分配和撤销内存的运算符 new用法:           1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a = new int(5) 作用同上,但是同时将整数赋值为5           2.     开辟数组空间 一维: int *a = new in

  • C++动态内存分配(new/new[]和delete/delete[])详解

    C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求.当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些函数在运行时从堆中(也称自由内存)分配存储单元,但是运用这些库函数需要计算需要开辟内存的大小,容易出现错误. 那么通常我们在C语言中我们开辟内存的方式如下: (void*)mall

  • C++表达式new与delete知识详解

    在C++中,new表达式用于动态创建对象,即在堆(自由存储区)空间上为对象分配内存,而程序员也要小心的使用这些申请来的内存空间,当不再使用时应该调用delete表达式来释放该存储空间并且将指针置零. 本文学习了如何动态创建对象,动态创建的对象与一般对象的区别,动态创建的对象的初始化以及释放动态分配的内存等知识点. C++中分配的内存大致有三类:静态存储区,栈内存和堆内存 其中,静态存储区是在程序编译阶段就已经分配好的,用于全局变量,static变量等:堆栈是比较常用的对象存储方式. new和de

  • C/C++: Inline function, calloc 对比 malloc

    Inline function is like a macro definition. When it was be called in another function, the control right will not be changed to this function. The compiler will just replace the line of inline function with the actual content of the function. We use

  • C++中new和delete的介绍

    介绍 1.malloc,free和new,delete区别. a.malloc,free是C/C++的标准库函数.new,delete是c++的操作符. b.malloc申请的是内存,严格意义不是"对象",new申请的可以理解为"对象",new 时会调用构造函数,返回指向该对象的指针. c.对于class类型,必须用new/delete来创建和销毁,自动调用构造和析构函数,malloc/free无法胜任. 2.使用new遵循原则: a.用new申请的内存,必须用de

  • 深入浅析C++的new和delete

    new和delete的内部实现 C++中如果要在堆内存中创建和销毁对象需要借助关键字new和delete来完成.比如下面的代码 class CA { public: CA()m_a(0){} CA(int a):m_a(a){} virtual void foo(){ cout<<m_a<<endl;} int m_a; }; void main() { CA *p1 = new CA; CA *p2 = new CA(10); CA *p3 = new CA[20]; delet

  •  C++ new 和 delete 关键字详解

    目录 前言 new 和 delete 的使用 new delete 为数组分配内存和释放内存 malloc 和 new delete 和 delete[] 前言 最早接触到new这个关键字,是在 Java 中,然后 ES6 之后的 js 中也提供了 new 这个关键字,在 java 和 js 这两门语言中,使用 new 关键词可以实例化类的对象.语义是相似的,但是其背后还是有些差异的,js 的 new 和 class 可能是一些语法糖. 那么有了这些对 new 这个关键字用法的了解,我们今天来看

  • 浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利 grant select on testdb.* to common_user@'%' grant insert on testdb.* to common_user@'%' grant update on testdb.* to common_user@'%' grant delete on testdb.* to c

  • MySQL中参数sql_safe_updates在生产环境的使用详解

    前言 在应用 BUG或者 DBA误操作的情况下,会发生对全表进行更新:update delete 的情况.MySQL提供 sql_safe_updates 来限制次操作. set sql_safe_updates = 1; 设置之后,会限制update delete 中不带 where 条件的SQL 执行,较严格.会对已有线上环境带来不利影响.对新系统.应用做严格审核,可以确保不会发生全表更新的问题. CREATE TABLE working.test01 (id INT NOT NULL AU

  • 对Django 中request.get和request.post的区别详解

    Django 中request.get和request.post的区别 POST和GET差异: POST和GET是HTTP协议定义的与服务器交互的方法.GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.另外,还有PUT和DELETE方法. POST和GET都可以与服务器完成查,改,增,删操作. GET提交,请求的数据会附在URL之后,以?分割URL和传输数据,多个参数用&连接: POST提交,把提交的数据放置在HTTP包的包体中:因此,GET提交的数据会在地址栏中显示出来,而PO

  • MyBatis注解方式之@Update/@Delete使用详解

    @Update 1. RoleMapper接口增加接口方法 /** * * * @Title: updateSysRoleById * * @Description: updateSysRoleById * * @param sysRole * @return * * @return: int */ @Update({ "update sys_role set role_name = #{roleName},enabled = #{enabled},create_by = #{createBy}

  • Java中文件的读写方法之IO流详解

    目录 1.File类 1.1File类概述和构造方法 1.2File类创建功能 1.3File类判断和获取功能 1.4File类删除功能 2.递归 2.1递归 2.2递归求阶乘 2.3递归遍历目录 3.IO流 3.1 IO流概述和分类 3.2字节流写数据 3.3字节流写数据的三种方式 3.4字节流写数据的两个小问题 3.5字节流写数据加异常处理 3.6字节流读数据(一次读一个字节数据) 3.7字节流复制文本文件 3.8字节流读数据(一次读一个字节数组数据) 3.9字节流复制图片 总结 1.Fil

  • MySQL中增删改查操作与常见陷阱详解

    目录 本文导读 一.MySQL的增删改查 1.insert语句 2.delete语句 3.update语句原理 4.select 二.15种MySQL数据操作语句 1.REPLACE语句 2.CALL语句 3.TABLE语句 4.WITH语句 三.MySQL查询陷阱 总结 本文导读 本文作为MySQL系列第二篇文章,详细讲解了MySQL的增删改查的语句.语义和一些我们经常在开发工作中暴露的问题,MySQL的增删改查又叫数据操作语句,本文有讲些了一些常用的数据操作语句,select语句后续将作为一

  • cordon节点drain驱逐节点delete节点详解

    目录 一.系统环境 二.前言 三.cordon节点 3.1 cordon节点概览 3.2 cordon节点 3.3 uncordon节点 四.drain节点 4.1 drain节点概览 4.2 drain 节点 4.3 uncordon节点 五.delete 节点 5.1 delete节点概览 5.2 delete节点 一.系统环境 服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Do

  • javascript ES6中set集合、map集合使用方法详解与源码实例

    set与map理解 ES6中新增,set集合和map集合就是一种数据的存储结构(在ES6之前数据存储结构只有array,object),不同的场景使用不同的集合去存储数据 set集合 Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用. set集合语法: //创建一个set集合,传参为一个可迭代的对象 const s1 = new Set(iterable); API 名称 类型 简介 Set.add() 原型方法 添加数据 Set.has() 原型方法 判断是否存在一个数据 S

随机推荐