new 和 malloc 的区别 及使用
定义上:malloc memory allocation 动态内存分配 是别及c中的一个函数
使用方法:

extern void *malloc(unsigned int num_bytes)
extern void *malloc(unsigned int num_bytes)
um_bytes内存块字节长度。
内存块大小确定:malloc是使用通过我们计算然后得到一块新内存,然后指定数据类型并且内存值也是随机的。
使用时:需要引入头文件库函数 stdlib.h 或是别及 malloc.h(malloc.h与alloc.h一致)。
内存分配位置:堆中动态分配的使用内存。
具体分配过程:由程序向操作系统申请,别及操作系统遍历空闲结点链表,将第一个大于申请空间的堆结点分配给程序,然后将空闲结点链表中此节点删掉。
成功分配:返回值为指向被分配内存的使用指针。
失败分配:返回值为空NULL。别及
返回类型:void* (未确定类型的使用指针)。
void*类型可以通过强制类型转换转换为任意其他类型(因为用户存储数据类型未知,别及由用户决定数据类型)。
内存块释放:free()函数 将内存还给程序或操作系统。使用
注意:malloc与free都属于c/c++标准库函数,别及在使用时应该配对 申请之后不释放就会有可能发生内存泄漏。
使用free时需要检查指针是使用否为空。
ew 是别及c++中的运算符(其地位等同于“+”,“=”)。
在使用:new时不止分配内存,使用还会进行初始化,执行相应构造函数,初始化时需要指定数据类型。免费信息发布网
内存分配位置:自由存储区为对象分配内存。别及
使用时:无需引入头文件,new是保留字。
ew 和 delete 是配对使用的。
在使用delete时注意将指针置为0,否则会形成悬垂指针(指针所指内存已被释放,仍指向该内存),造成错误。
ew 可以看做是malloc 加 构造函数的执行,就是new更高级一些。
ew的几种用法:
1 int *p=new int; //在自由存储区开辟一个int变量 2 int *p=new int[10];//在自由存储区开辟一个int数组,有10个元素 3 int *p=new int(10);//在自由存储区开辟一个int变量,并初始化为10
释放内存时无需检查是否为空。
如果p等于NULL,则delete p不作任何事情。由于之后可以得到测试,并且大多数的测试方法论都强制显式测试每个分支点,因此你不应该加上多余的 if 测试。
错误的:
1 if (p != NULL) 2 delete p; 3正确的:delete
面试时可能会问到的问题:
1)它们都可用于申请动态内存和释放内存。
2)malloc是库函数只能作用于内部数据类型,对于非内部数据动态对象而言,就不能完成对象的初始化与销毁,即执行构造函数与析构函数,而new 与 delete此类运算符就能够在编译器的控制权限内完成,对象的网站模板初始化与销毁任务,即执行构造函数与析构函数。
既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
注意:如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。
如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
零值指针,是值是0的指针,可以是任何一种指针类型,可以是通用变体类型void*也可以是char*,int*等等。 空指针,其实空指针只是一种编程概念,就如一个容器可能有空和非空两种基本状态,而在非空时可能里面存储了一个数值是0,因此空指针是人为认为的指针不提供任何地址讯息。
内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
http://shenzhen.offcn.com/
相关文章
深入了解飞行堡垒BIOS教程(掌握飞行堡垒BIOS设置技巧,保障电脑安全和性能)
摘要:随着电脑技术的不断发展,飞行堡垒BIOS作为一种重要的系统设置工具,对电脑的安全性和性能起着至关重要的作用。本文将以飞行堡垒BIOS教程为主题,通过详细介绍和解读,帮助读者更好地了...2025-11-05
0. 前言C++ 里的模板能做什么呢?它好比 C 语言中的宏、C# 和 Java 中的自省(restropection)和反射(reflection),是 C++ 语言的外延。更极端一点地理解:它是一2025-11-05
为什么 Eslint 可以检查和修复格式问题,而 Babel
Eslint 可以检查出代码中的错误和一些格式问题,并能自动修复,它的实现原理就是基于 AST (抽象语法树)。通过 Parser 把源码解析成 AST 对象树,源码字符串中的各种信息就被保存到了这个2025-11-05- 线上服务的MongoDB中有一个很大的表,我查询时使用了sort()根据某个字段进行排序,结果报了下面这个错误:[Error] Executor error during find command :2025-11-05
通过激情探索学习(以passion为引导,最大化教程的效果与体验)
摘要:在我们日常的学习和工作中,使用教程是一种常见的学习方法。然而,很多人只是机械地按照教程进行操作,缺乏激情和主动性。本文将以passion作为核心,探讨如何通过激情的方式使用教程,以...2025-11-05
在创业的动态环境中,小型企业经常发现自己在不懈地追求成功,通过各种挑战来建立在市场上站稳脚跟。对于小型企业而言,能否成功的关键因素之一是其客户关系战略。与客户建立有意义的联系不仅能够培养忠诚度,而且还2025-11-05

最新评论