(文章目录)
前言
本篇文章我们来讲解一下new delete 和malloc free的区别,这个区别在许多面试题中也会经常问到,那么我们就具体的来看看他们有什么不同吧。
一、区别
new 和 delete 是 C++ 中的运算符,用于动态分配和释放内存空间,而 malloc 和 free 是 C 语言中的函数,用于同样的目的。下面是它们之间的区别:
1.类型安全性:new 和 delete 是类型安全的,它们会自动进行对象的构造和析构函数的调用,确保正确的内存管理。而 malloc 和 free 是无类型的,它们只是返回一个指向 void 类型的指针,需要手动处理对象的构造和析构。
2.运算符 vs 函数:new 和 delete 是 C++ 中的运算符,使用起来更像是语言的一部分,而 malloc 和 free 是 C 语言中的函数。
3.内存分配相关信息:new 和 delete 可以根据对象类型的信息来进行合适的内存分配,包括对象大小和构造函数等。而 malloc 和 free 只是根据指定的字节数进行内存分配和释放,并不知道对象的具体类型和构造要求。
4.重载:new 和 delete 运算符可以重载,可以通过自定义的 new 和 delete 运算符实现特定的内存管理行为。但是 malloc 和 free 无法重载。
5.异常处理:对于 new 操作符,当内存分配失败时,可以抛出 std::bad_alloc 异常。而 malloc 在分配失败时,返回 NULL 指针,需要手动检查返回值来处理内存分配失败的情况。
总体上,new 和 delete 是 C++ 提供的更高级别、更安全和更方便的内存管理机制,尤其在处理类对象时更加方便。而 malloc 和 free 则是在 C 语言中使用的较低级别的内存管理函数,更适合在 C 代码中使用。在 C++ 中,推荐使用 new 和 delete 来进行动态内存的分配和释放。
二、动态申请类成员变量的区别
当使用 new 运算符来申请一个类对象的内存时,会自动调用类的构造函数来初始化对象。当使用 delete 运算符释放该对象的内存时,会自动调用类的析构函数来进行对象资源的清理。
例如,考虑以下类的定义:
class MyClass {
public:
MyClass() {
std::cout << "Constructor called." << std::endl;
}
~MyClass() {
std::cout << "Destructor called." << std::endl;
}
};
使用 new 运算符来创建 MyClass 对象:
MyClass* obj = new MyClass();
这将自动调用 MyClass 的构造函数,并输出 “Constructor called.”。
使用 delete 运算符释放对象的内存:
delete obj;
这将自动调用 MyClass 的析构函数,并输出 “Destructor called.”。
可见,new 运算符和 delete 运算符对于类对象的内存管理会自动调用构造函数和析构函数,确保对象的正确初始化和资源释放。
相比之下,malloc 和 free 函数是 C 语言提供的,不会自动调用对象的构造函数和析构函数。它们只是分配和释放指定字节数的内存空间,并不关心内存中存储的是什么类型的对象。
因此,如果使用 malloc 来分配内存用于类对象,需要手动调用构造函数来初始化对象,并在释放内存之前手动调用析构函数来进行资源清理。
下面是使用 malloc 和 free 对象的示例:
MyClass* obj = static_cast<MyClass*>(malloc(sizeof(MyClass))); // 使用 malloc 分配内存
new (obj) MyClass(); // 手动调用构造函数初始化对象
// 使用对象
obj->~MyClass(); // 手动调用析构函数清理资源
free(obj); // 释放对象的内存
可以看到,在使用 malloc 和 free 的情况下,需要手动调用构造函数和析构函数,来确保对象的正确初始化和资源释放。而使用 new 和 delete 运算符则可以自动处理这些操作,更加方便和安全。
总结
本篇文章就讲解到这里,希望大家可以好好理解他们之间的区别。
标签:malloc,day2,free,运算符,内存,new,delete From: https://blog.51cto.com/u_16153875/7976710