• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++中new与delete、malloc与free应用分析

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++ malloc,malloc delete,malloc和new的区别,malloc new,c new malloc等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一般来说,在C/C++的面试时,对于new/delete和malloc/free这两对的使用和区别经常被考查到,如果这种基础的问题都答不上来,估计很难过面试了。本文即是对new/delete和malloc/free这两对的使用和区别较为简单的分析一下,供大家参考。

一、new和delete

new和delete是C++的运算符,用于动态分配内存和释放内存。

1.new表达式

标准库定义了operator new函数的几个重载版本,没有使用noexcept说明的版本在内存分配失败时可能会抛出bad_alloc异常,而使用了的不会抛出异常。

void* operator new ( size_t ); 
void* operator new[]( size_t );  
void* operator new ( size_t , const nothrow_t& ) noexcept; 
void* operator new[]( size_t , const nothrow_t& ) noexcept;

</div>

当我们使用new表达式时,实际执行了三步操作:

①.new表达式调用上面的operator new(或者operator new[])的标准库函数,函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或者对象的数组)。
②.编译器运行相应的构造函数以构造这些对象,并为其传入初始值。
③.对象被分配了空间并构造完成,返回一个指向该对象的指针。

对于operator new函数或者operator new[]函数来说,它的返回类型必须是void*,第一个形参的类型必须是size_t且该形参不能含有默认实参。当编译器调用operator new或者operator new[]函数时,会把存储指定对象或者指定对象的数组所需的字节数传给size_t形参。

2.delete表达式

标准库也定义了operator delete函数的几个重载版本,noexcept说明符表示在内存分配失败时返回空指针而不是抛出bad_alloc异常。

void operator delete ( void* ) noexcept; 
void operator delete[]( void* ) noexcept; 
void operator delete ( void* , const nothrow_t& ) noexcept; 
void operator delete[]( void* , const nothrow_t& ) noexcept; 
</div>

当我们使用delete表达式时,实际执行了两步操作:

①.对指针所指的对象或者所指的数组中的元素执行对应的析构函数。
②.编译器调用operator delete(或者operator delete[])的标准库函数释放内存空间。

对于operator delete函数或者operator delete[]函数来说,它们的返回类型必须是void,第一个形参的类型必须是void*。执行一条delete表达式将调用相应的operator函数,并用指向待释放内存的指针来初始化void*形参。

二、malloc和free

malloc和free是C/C++中的标准库函数,也是用于申请动态内存和释放内存。

void* malloc( size_t size ); 
void free( void* ptr ); 

</div>

malloc函数接受一个表示待分配字节数的size_t,返回指向分配空间的指针;如果分配失败,则返回空指针。free函数接受一个void*,它是malloc返回的指针的副本,free将相关内存返还给系统。注意:malloc函数并不会调用构造函数来初始化内存,free函数也不会自动调用析构函数。

三、new和malloc、delete和free的区别

int *p1 = new int;   // 没有初始化列表, 所以没有初始化 
int *p2 = new int();  // 空初始化列表, 执行zero初始化, 所以初始化为0 
int *p3 = new int(3); // 非空初始化列表, 执行值初始化, 所以初始化为3 
// 注:对于没有构造函数的内置类型,new会不会初始化在于有没有初始列表(空列表“()”也算) 
int *p4 = new int[100];   // 分配大小为sizeof(int)*100; 
 
int *p5 = (int*)malloc(sizeof(int)*128); 
double *p6 = (double*)malloc(sizeof(double)*12); 

</div>

new和malloc的区别:

①.new是一个运算符,malloc()是一个库函数。

②.new会调用构造函数,而malloc()不会。

③.new返回指定类型的指针,而malloc()返回void*。

④.new会自动计算需要分配的空间,而malloc()需要手工计算字节数。

⑤.new可以被重载,而malloc()不能。

delete p1; 
delete [] p2; 
free(p3); 
free(p4);

</div>

delete和free的区别:

①.delete是一个运算符,free()是一个库函数。

②.delete会调用析构函数,而free()不会。

③.delete可以被重载,而free()不能。

总结:

malloc和free是C/C++中的标准库函数,new和delete是C++的运算符。对于非内置数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-28String类的写时拷贝实例
  • 2017-05-28VC实现Windows多显示器编程的方法
  • 2017-05-28C语言+win32api写窗体应用程序
  • 2017-05-28C语言实现BMP转换JPG的方法
  • 2017-05-28c++通过引用实现三个数字求最大值
  • 2017-05-28C++中指向对象的常指针与指向常对象的指针详解
  • 2017-05-28结合C++11新特性来学习C++中lambda表达式的用法
  • 2017-05-28详解C++中StringBuilder类的实现及其性能优化
  • 2017-05-28深入探讨:main函数执行完毕后,是否可能会再执行一段代码?
  • 2017-05-28深入解析Radix Sort基数排序算法思想及C语言实现示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言中sscanf()函数的字符串格式化用法
    • 不要被C++(自动生成规则)所蒙骗
    • c语言冒泡排序法代码
    • 用c语言根据可变参数合成字符串的实现代码
    • C++中的delete不会将操作数置0
    • c++面试题字符串拷贝函数示例
    • 使用C# 判断给定大数是否为质数的详解
    • C语言 文件的随机读写详解及示例代码
    • 下标操作符重载模拟多维数组详解
    • 详解state状态模式及在C++设计模式编程中的使用实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有