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();
}
欢迎加群交流:C/C++开发交流
malloc/free和new/delete详解与应用的更多相关文章
- C++ 内存分配操作符new和delete详解
重载new和delete 首先借用C++ Primer 5e的一个例子: string *sp = new string("a value"); ]; 这其实进行了以下三步操作: ...
- C++ new/delete详解及原理
学了冯诺依曼体系结构,我们知道: 硬件决定软件行为,数据都是围绕内存流动的. 可想而知,内存是多么重要.当然,我们这里说的内存是虚拟内存(详情看Linxu壹之型). 1.C/C++内存布局 2.C语言 ...
- OAF_EO系列6 - Delete详解和实现(案例)
2014-06-14 Created By BaoXinjian
- RMAN主要命令 show,list,crosscheck,delete详解
Oracle RMAN 的 show,list,crosscheck,delete命令整理 Oracle RMAN 的 show,list,crosscheck,delete命令整理 1.SHOW命 ...
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...
- new、delete与malloc、free的详解
内容清单: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
- C++之new/delete/malloc/free详解
主要内容: 1. C语言中的函数malloc和free 2. C++中的运算符new和delete 3. new/delete与malloc/free之间的联系和区别 4. C/C++程序的内 ...
- malloc 与 free函数详解<转载>
malloc和free函数详解 本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...
- 原生JS:delete、in、typeof、instanceof、void详解
delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/doc ...
随机推荐
- a=”hello”和b=”世界”编码成bytes类型
a="hello" c=a.encode(encoding='utf-8') a = b'hello' b="世界" b = b.encode(encoding ...
- Python基础之各种推导式玩法
一.推导式套路 除了我们之前所学习的列表推导式和生成器表达式之外,还有字典推导式.集合推导式等等. 下面就是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. variable = [out ...
- hadoop namenode启动失败
hadoop version=3.1.2 生产环境中,一台namenode节点突然挂掉了,,重新启动失败,日志如下: Info=-64%3A1391355681%3A1545175191847%3AC ...
- GCC与GDB使用
GCC基本命令 gcc[选项][文件名] -E:仅执行编译预处理(.c->.i) -S:将c代码转换成汇编代码(.i->.s) -c:仅执行编译操作,不进行连接操作(.s->.o) ...
- Flutter移动电商实战 --(50)持久化_shared_preferences
当app关掉了.再进去的时候 ,购物车的内容还是存在. sqflite提供这个来操作SQLite数据库 flutter提供三种持久化的工具 今天要学的就是 shared_preferences 还有一 ...
- python pip 安装插件权限问题及 指定pip国内镜像源
- usb 设备 复位
How to Reset USB Device in Linux by ROMAN10 on MAY 4, 2011 · 9 COMMENTS USB devices are anywhere n ...
- Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询
--表名,表占用空间大小(MB),行数select table_name, round(num_rows * avg_row_len /1024/1024, 8) as total_len, num_ ...
- CNCF基金会的Certified Kubernetes Administrator认证考试计划
关于CKA考试 CKA(Certified Kubernetes Administrator)是CNCF基金会(Cloud Native Computing Foundation)官方推出的Kuber ...
- 导出 VuePress构建的网站为 PDF
前言 学 Rust 也有一段时间了,网上也有不少官方文档的中文翻译版,但是似乎只有 Rust中文网站 文档一直是最新的,奈何并没有 PDF 供直接下载,是在是不太方便,为了方便阅读以及方便后续文档更新 ...