new和malloc区别,delete和delete []区别
面试被问到上述问题,所以特地总结一下:
一、new和malloc的区别。
1.new可以返回指定类型的指针,并且自动分配内存大小;malloc需要计算手动计算分配空间的大小,并且返回值需要强转为实际类型的指针。
2.malloc只会进行内存分配,不会进行初始化,所以其值是随机的;new在内存分配的同时会进行初始化。
3.malloc分配失败会返回空指针NULL;new分配失败会抛出std::bad_alloc异常。
这里插入一个例子(还没太明白,先mark在这里)
#include<iostream>
using namespace std; void* operator new(std::size_t) throw (std::bad_alloc)
{
throw bad_alloc();
} void operator delete(void* p) throw()
{
} class widget
{
public:
widget()
{
cout << "widget()" <<endl;
}
}; int main()
{
try
{
widget *pw1 = new widget;// 分配失败抛出std::bad_alloc
if(pw1 == ) // 这个检查一定失败
{
cout << "pw1" <<endl;
}
}
catch(...)
{
cout << "throw "<< endl;
} try
{
widget *pw2 = new (nothrow) widget; // 若分配失败返回0
if(pw2 == ) // 这个检查可能会成功
{
cout << "pw2" <<endl;
}
}
catch(...)
{
cout << "throw "<< endl;
} return ;
}
4.有了malloc/free为什么还要new/delete?
简而言之:malloc/free是库函数,new/delete是C++的运算符。malloc/free不能执行构造函数和析构函数,在动态分配内存的时候也不能进行初始化,不能完成对象的内存管理。
5.有了new/delete为什么还要malloc/free?
因为C++经常调用C函数,而C程序只能用malloc/free管理动态内存。
(参考:http://www.cnblogs.com/fly1988happy/archive/2012/04/26/2470542.html)
二、delete和delete []区别
delete 释放new分配的单个对象指针指向的内存
delete[] 释放new分配的对象数组指针指向的内存
1.对于简单类型来说
int *a = new int[10];
delete a;
delete [] a;
两者效果相同。
2.对于自定义的对象来说
A *a = new A[10];
delete a;
delete []a;
delete a只会调用a[0]的析构函数,a[1]-a[9]分配的空间不会被释放。
delete []a;会调用a[0]-a[9]的析构函数,释放a指针指向的全部内存空间,会逐一调用对象的析构函数。
(参考:https://www.cnblogs.com/wangjian8888/p/7905176.html)
三、使用new[]/delete[]时的内存分布情况
对非内置对象new[]时会多分配4个字节,因为需要存放析构时的对象个数,对于内置类型则不需要这个4个字节。
(参考https://blog.csdn.net/qq_33573235/article/details/79485266,讲的非常详细了)
new和malloc区别,delete和delete []区别的更多相关文章
- malloc/free与new/delete的区别
相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用m ...
- malloc free 和new delete区别
从网上看的学习之 1. malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,与"+“.”-“.”*“.”/“有一样的地位. 2. new/delete是 ...
- malloc/free和new/delete的区别汇总
一.基本概念 malloc/free 1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回 ...
- new malloc和delete free 的区别
今天看了一个面试题:问new 和 malloc, delete 和 free 的区别,扭捏了半天,也没说完全:现总结如下: 1.先看看new 和 delete 看一个例子: <span styl ...
- malloc/free与new/delete的区别与联系
相同点:(1)都是申请内存,释放内存,free和delete可以释放NULL指针:(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作 ...
- c++ 浅拷贝和深拷贝 指针和引用的区别 malloc(free)和new(delete)的区别 重载重写重定义
4.malloc(free)和new(delete)的区别 malloc()函数: 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void ...
- 百度笔试题:malloc/free与new/delete的区别(转)
百度笔试题:malloc/free与new/delete的区别 相同点:都可以申请动态内存和释放内存. 不同点: (1) 操作对象有所不同: malloc和free是C/C++的标准库函数,new和d ...
- malloc/free和new/delete的区别
转自:http://blog.csdn.net/chance_wang/article/details/1609081 malloc与free是C++/C语言的标准库函数,new/delete是C++ ...
- malloc,free和new,delete之间的区别
1.malloc free 是c语言里面的,不过在c++中也能使用,这个只是申请的一块内存,一般不能申请对象的内存空间:2.new delete,是c++的,申请的也是一块内存,只是这个可以申请对象. ...
随机推荐
- 51nod 1228、1258 序列求和
这里一次讲两题...貌似都是板子? 所以两题其实可以一起做 [雾 noteskey 总之就是伯努利数的两道入门题啦,就是第二道有点鬼畜了,居然要任意模数的!(好吧是 1e9+7 但也没什么区别了) 伯 ...
- Tomcat:3DES解密时中文乱码
情况说明:直接用main方法运行时是没有问题的,web程序一放入tomcat中就会出现解密时乱码. 解决办法: 在解密时,返回string时对数组需要指定UTF-8编码. public static ...
- 爬虫-requests
一.爬虫系列之第1章-requests模块 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的 ...
- kth min_max容斥
题解: 普通的$min-max$容斥是用来求最后出现元素的期望之类的 $kth min-max$容斥进一步解决倒数第k个出现的元素的期望 给出公式: $kthmax(S)=\sum\limits_{T ...
- python之cookie, cookiejar 模拟登录绕过验证
0.思路 如果懒得模拟登录,或者模拟登录过于复杂(多步交互或复杂验证码)则人工登录后手动复制cookie(或者代码读取浏览器cookie),缺点是容易过期. 如果登录是简单的提交表单,代码第一步模拟登 ...
- js中一个对象中遇到一个相同的key所对应的value值相加
如图: 变成: js原生如下: var abc=[ {typeid:1,ade:1}, {typeid:2,ade:1}, {typeid:1,ade:2}, {typeid:1,ade:2}, {t ...
- 课堂小记---JavaScript(1)
day01 1.数据类型 number string boolean undefined object function 加号具有两种功能,数字相加 和 字符串拼接.加号两边只要碰见字符串,则执行字 ...
- python 用xlwt包把数据导出到excel表中
def write_excel(): f = xlwt.Workbook() #创建工作簿 ''' 创建第一个sheet: sheet1 ''' sheet1 = f.add_sheet(u'shee ...
- HTTP协议是无状态的
含义: 无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系 实际中的使用情况: 在web应用中,我 ...
- LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...