# 关于malloc和new区别的讨论
在C++中,内存动态分配可以通过两种方式实现:使用C语言的malloc
函数或C++的new
运算符。尽管它们都用于分配内存,但在使用方法、功能和内存管理等方面存在显著差异。以下是对两者的简略比较:
# 1.malloc
和 free
首先两者的回收内存的关键字不同,先来说malloc
和 free
这一组。
用法:
malloc
是一个C库函数,用于分配指定字节数的内存。free
是一个C库函数,用于释放之前通过malloc
分配的内存。
语法:
void *malloc(int size); // malloc的函数声明
#include <cstdlib> // 在Cpp中
#include <stdlib.h>// 在C中
int* array = (int*)malloc(10 * sizeof(int)); // 分配一个长度为10的整形数组
free(array); // 释放内存
1
2
3
4
5
6
7
2
3
4
5
6
7
由于malloc
在函数声明时返回值为void*
,所以当我们在使用malloc
一般会将其强制类型转化,并且在使用时要标名申请内存的大小。
特点:
- 返回
void*
类型的指针,需要手动进行类型转换。 - 不会调用构造函数或析构函数(C++中的对象初始化和清理需要手动处理)。
- 分配的内存未初始化,内容为未定义。
- 主要用于C语言中,在C++中使用
malloc
可能会丢失C++语言提供的某些特性。
# 2.new
和 delete
用法:
new
是C++中的运算符,用于分配并初始化内存。delete
是C++中的运算符,用于释放内存并调用对象的析构函数。
语法:
#include <iostream>
int* array = new int[10]{0}; // 分配一个长度为10的整形数组,并且初始化为0
delete[] array; // 释放内存
1
2
3
4
2
3
4
使用new
来分配空间,可以初始化变量。
特点:
- 不需要进行类型转换,直接返回指定类型的指针。
- 自动调用对象的构造函数,确保对象初始化。
- 与之对应的
delete
运算符会自动调用析构函数,完成对象清理。 - 内存分配和释放方式与C++的面向对象特性兼容。
# 3.区别总结
- 类型安全性:
malloc
返回void*
,需要手动类型转换,可能导致类型不安全。new
不需要类型转换,直接返回对象类型的指针,类型安全。
- 初始化和清理:
malloc
只分配内存,不调用构造函数,不负责初始化。new
负责调用构造函数,进行对象初始化。free
只释放内存,不调用析构函数,不进行对象清理。( 如指针指向的空间会被释放,但是指针本身不会被释放 ,只有当程序结束时才会释放)delete
会调用析构函数,负责对象清理。
- 异常处理:
malloc
如果分配失败,返回NULL
,需要手动检查。new
如果分配失败,抛出std::bad_alloc
异常。
- 适用场景:
malloc
适用于C语言,或需要与C代码互操作的场景。new
适用于C++中的对象动态分配,更符合C++的面向对象特性。