面试题:malloc和new的区别

简介: 面试题:malloc和new的区别

面试题:malloc和new的区别

在C++中,mallocnew都可以用来动态地分配内存。但它们之间有着很多的区别,包括如下几个方面:

1. 返回值类型

  • malloc函数返回void*类型的指针,需要进行类型转换后才能使用。
  • new操作符直接返回分配内存类型的指针。

例如:

int *p = (int*)malloc(sizeof(int));
int *q = new int;

其中,malloc()分配了一个整型数据的内存空间,并且由于其返回类型为void*,因此需要强制类型转换,使其指向需要的指针类型;而new操作符则不需要类型转换。

2. 分配内存大小

  • malloc函数可以分配除基本类型(如int、char等)之外的任意大小的内存块。
  • new操作符只能分配类对象或特定类型的内存空间,如intdouble等。

例如:

int *p = (int*)malloc(10 * sizeof(int));  // 可以分配多个整型变量的内存空间
MyClass *obj = new MyClass;              // 只能分配一个MyClass类型对象的内存空间

3. 内存初始化

  • malloc函数分配的内存不会进行初始化。分配的内存中可能残留着其他程序留下的数据。
  • new操作符会自动对分配的内存进行初始化,如果分配的是基本类型则会将其初始化为0,如果是类对象则会调用类的默认构造函数进行初始化。

例如:

int *p = (int*)malloc(10 * sizeof(int));  // 内存空间中可能包含任意数值
MyClass *obj = new MyClass;  // 会调用MyClass类的默认构造函数来初始化该对象

4. 异常处理

  • malloc函数在分配失败时会返回NULL指针。需要程序显式地判断是否分配成功。
  • new操作符在分配失败时会抛出一个名为std::bad_alloc的异常,需要使用try-catch块来捕获异常并处理。

例如:

int *p = (int*)malloc(10000000000000000000000);   // 可能导致内存申请失败,需要检查是否分配成功
MyClass *obj = nullptr;
try {
    obj = new MyClass[10000000000000000000000];     // 可以通过异常处理机制来正确处理内存分配错误
}
catch (std::bad_alloc& e) {
    std::cerr << "allocation failed: " << e.what() << '\n';
}

综上所述,mallocnew都是C++中常用的动态内存分配方式,但它们之间有很多区别。malloc需要手动释放内存、可以分配任意大小的内存空间,但对于内存初始化、异常处理等功能相对简单;new操作符可以自动初始化分配的内存,对于类对象有更好的支持,但需要注意内存泄漏问题,并通过异常处理来正确处理内存分配错误。


相关文章
|
12天前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
12天前
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
6天前
|
存储 安全 Java
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
这篇文章是关于Java面试的第二天笔记,涵盖了HashMap与HashTable的区别、ConcurrentHashMap的实现原理、IOC容器的实现方法、字节码的概念和作用、Java类加载器的类型、双亲委派模型、Java异常体系、GC如何判断对象可回收、线程的生命周期及状态,以及sleep、wait、join、yield的区别等十道面试题。
一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)
|
15天前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
19天前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
21天前
|
Java 编译器 程序员
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
JVM常见面试题(一):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别
|
6天前
|
存储 关系型数据库 MySQL
一天五道Java面试题----第八天(怎么处理慢查询--------->简述Myisam和innodb的区别)
这篇文章是关于Java面试中关于数据库性能优化和MySQL特性的五个问题,包括处理慢查询、ACID特性保证、MVCC概念、MySQL主从同步原理以及MyISAM和InnoDB存储引擎的区别。
|
14天前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
29 4
|
1月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
67 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
14天前
|
机器学习/深度学习 存储 PyTorch
【深度学习】Pytorch面试题:什么是 PyTorch?PyTorch 的基本要素是什么?Conv1d、Conv2d 和 Conv3d 有什么区别?
关于PyTorch面试题的总结,包括PyTorch的定义、基本要素、张量概念、抽象级别、张量与矩阵的区别、不同损失函数的作用以及Conv1d、Conv2d和Conv3d的区别和反向传播的解释。
38 2