嵌入式刷题(day2 new delete 和malloc free的区别)

这篇具有很好参考价值的文章主要介绍了嵌入式刷题(day2 new delete 和malloc free的区别)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

总结

本篇文章就讲解到这里,希望大家可以好好理解他们之间的区别。文章来源地址https://www.toymoban.com/news/detail-546969.html

到了这里,关于嵌入式刷题(day2 new delete 和malloc free的区别)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式学习day34 网络

    TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接     SYN     SYN+ACK      ACK  2.在通信过程中通过序列号和确认号保障数据传输的完整性     本次发送序列号:上次收

    2024年03月10日
    浏览(33)
  • 嵌入式:ARM Day4

     源码:         在上述代码中,int *ptr定义了一个指向整数类型的指针ptr,(int *)将地址0x5000A28强制转换为整数类型的指针,后续可以通过*ptr访问与修改该地址空间中的值。  

    2024年02月12日
    浏览(38)
  • 嵌入式:ARM Day6

    目的:1.输入\\\'a\\\',显示\\\'b\\\',将输入的字符的ASCII码下一位字符输出            2.原样输出输入的字符串 源码: uart4.h  uart4.c main.c 结果1: 结果2: 

    2024年02月12日
    浏览(32)
  • 嵌入式:QT Day4

    源码: widget.h widget.cpp main.cpp

    2024年02月14日
    浏览(33)
  • 嵌入式:驱动开发 Day4

    驱动程序:myled.c 应用程序:test.c 头文件:head.h

    2024年02月09日
    浏览(32)
  • 嵌入式:C++ Day7

     源码:

    2024年02月15日
    浏览(26)
  • 嵌入式学习day22 Linux

    文件IO:     1. lseek        off_t lseek(int fd, off_t offset, int whence);        功能:             重新设定文件描述符的偏移量        参数:             fd:文件描述符             offset:偏移量             whence:                 SEEK_SET    文件开头                 SEEK_CUR

    2024年02月21日
    浏览(30)
  • 嵌入式:QT Day1

    源码: widge.h  widge.cpp  main.cpp

    2024年02月15日
    浏览(40)
  • 嵌入式:C高级 Day4

    冒泡排序 简单选择排序: 快速排序:

    2024年02月14日
    浏览(29)
  • 嵌入式学习-网络编程-Day5

    1.使用poll实现TCP服务器的并发 使用select实现TCP客户端的并发

    2024年01月20日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包