在C语言中,malloc 和 free 是用于动态内存分配和释放的函数。而在C++中,new 和 delete 提供了类似的功能,但它们之间有一些重要的区别。
1. malloc 和 free
malloc
malloc 函数用于在堆上动态地分配指定字节数的内存。它的原型在 stdlib.h 头文件中定义如下:
void *malloc(size_t size);- size:要分配的字节数。
- 返回值:一个指向已分配内存的指针,如果内存分配失败则返回 NULL。
使用 malloc 分配的内存块需要手动初始化,因为它只是分配了内存但没有初始化它。
free
free 函数用于释放之前使用 malloc、calloc 或 realloc 分配的内存块。它的原型在 stdlib.h 头文件中定义如下:
void free(void *ptr);- ptr:指向要释放的内存块的指针。
当调用 free 后,指针本身并不会自动设为 NULL,因此为了避免悬挂指针(dangling pointer),最好手动将指针设为 NULL。
2. new 和 delete
new
在C++中,new 运算符用于在堆上动态地分配内存并初始化对象。它的用法如下:
T* ptr = new T(args);  // 分配并初始化一个类型为T的对象- T:要创建的对象类型。
- args:传递给对象构造函数的参数(如果有的话)。
- 返回值:一个指向新创建对象的指针。
使用 new 分配的对象会自动调用构造函数进行初始化。
delete
delete 运算符用于释放之前使用 new 分配的内存块,并调用对象的析构函数。它的用法如下:
delete ptr;  // 释放ptr指向的内存,并调用其析构函数- ptr:指向要释放的内存块的指针。
当调用 delete 后,指针本身并不会自动设为 nullptr(C++11及以后版本推荐使用 nullptr 而不是 NULL),因此为了避免悬挂指针,最好手动将指针设为 nullptr。
3. malloc/free 与 new/delete 的区别
- 类型安全:new和delete是类型安全的,它们知道正在处理的对象类型,因此会调用相应的构造函数和析构函数。而malloc和free只是分配和释放内存,不知道对象的类型,因此不会调用构造函数或析构函数。
- 初始化:使用 new分配的对象会自动调用构造函数进行初始化,而malloc分配的内存块需要手动初始化。
- 异常安全性:new在内存分配失败时会抛出std::bad_alloc异常,而malloc在内存分配失败时会返回NULL。
- 返回值:malloc返回一个void*类型的指针,需要手动进行类型转换;而new直接返回对应类型的指针。
- 语法:new和delete是C++的运算符,具有更简洁的语法;而malloc和free是C语言库函数,需要包含相应的头文件。
- 内存泄漏:无论是使用 malloc/free还是new/delete,如果忘记释放分配的内存,都会导致内存泄漏。因此,在使用这些函数和运算符时,需要格外小心。