嵌入式刷题(day2 new delete 和malloc free的区别)
  micz61TEX78l 2023年11月02日 54 0

(文章目录)


前言

本篇文章我们来讲解一下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 运算符则可以自动处理这些操作,更加方便和安全。

总结

本篇文章就讲解到这里,希望大家可以好好理解他们之间的区别。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

micz61TEX78l