New delete 与malloc free 的联系与区别【实用3篇】
New delete 与malloc free 的联系与区别 篇一
在C++和C语言中,内存管理是一个非常重要的概念。在程序中使用动态内存分配可以让我们更好地控制内存的使用和释放,从而提高程序的效率和性能。在C++中,我们通常使用new和delete关键字来进行动态内存分配和释放,而在C语言中则使用malloc和free函数。
首先,我们来看一下new和delete的用法和特点。new是C++中用于动态分配内存的操作符,它会在堆中分配一块指定大小的内存,并返回指向这块内存的指针。我们可以使用new来创建单个对象、数组以及类的实例。delete用于释放通过new分配的内存,它会调用对象的析构函数并释放内存。需要注意的是,在使用delete释放内存之前,我们必须先调用对应对象的析构函数,否则可能会导致内存泄露。
与此相对应,malloc和free是C语言中用于动态内存分配和释放的函数。malloc函数会在堆中分配指定大小的内存,并返回指向这块内存的指针。与new不同,malloc只分配内存,并不会调用对象的构造函数。我们可以使用malloc来分配任意类型的内存块,包括基本类型、结构体和数组等。free函数用于释放通过malloc分配的内存,它不会调用对象的析构函数,因此需要手动释放对象的资源。
虽然new和malloc在功能上都可以实现动态内存分配,但它们之间存在一些区别。首先,new和delete是C++中的关键字,而malloc和free是C语言中的函数。这意味着在C++中,我们可以使用new和delete来进行动态内存分配和释放,而在C语言中则只能使用malloc和free。另外,new和delete支持运算符重载和类型检查,可以用于创建和销毁类的实例,而malloc和free则只能用于分配和释放内存块。
此外,new和delete对于数组的处理也与malloc和free有所不同。在C++中,我们可以使用new[]和delete[]来分配和释放数组的内存。new[]会分配一块连续的内存,用于存储数组的元素,并返回指向数组第一个元素的指针。delete[]会释放通过new[]分配的数组内存,并调用数组元素的析构函数。而在C语言中,我们可以使用malloc和free来分配和释放数组的内存,但需要手动计算数组元素的偏移量,并调用数组元素的构造函数和析构函数。
综上所述,new delete与malloc free在功能和用法上存在一些差异。new和delete是C++中的关键字,支持运算符重载和类型检查,用于动态分配和释放对象的内存。malloc和free是C语言中的函数,用于分配和释放内存块,需要手动管理对象的构造和析构。在实际应用中,我们需要根据具体的需求选择合适的内存管理方式,以提高程序的效率和可维护性。
New delete 与malloc free 的联系与区别 篇三
operator new 和 operator delete
这两个其实是 C++ 语言标准库的库函数,原型分别如下:
void *operator new(size_t); //allocate an object
void *operator delete(void *); //free an object
void *operator new[](size_t); //allocate an array
void *operator delete[](void *); //free an array
后面两个你可以先不看,后面再介绍。前面两个均是 C++ 标准库函数,你可能会觉得这是函数吗?请不要怀疑,这就是函数!C++ Primer 一书上说这不是重载 new 和 delete 表达式(如 operator= 就是重载 = 操作符),因为 new 和 delete 是不允许重载的。但我还没搞清楚为什么要用 operator new 和 operator delete 来命名,比较费解。我们只要知道它们的意思就可以了,这两个函数和 C 语言中的 malloc 和 free 函数有点像了,都是用来申请和释放内存的,并且 operator new 申请内存之后不对内存进行初始化,直接返回申请内存的指针。
我们可以直接在我们的程序中使用这几个函数。
new 和 delete 背后机制
知道上面两个函数之后,我们用一个实例来解释 new 和 delete 背后的机制:
我们不用简单的 C++ 内置类型来举例,使用复杂一点的类类型,定义一个类 A:
class A
{
public:
A(int v) : var(v)
{
fopen_s(&file, "test", "r");
}
~A()
{
fclose(file);
}
private:
int var;
FILE *file
;
};
很简单,类 A 中有两个私有成员,有一个构造函数和一个析构函数,构造函数中初始化私有变量 var 以及打开一个文件,析构函数关闭打开的文件。
我们使用