首页 > 其他分享 >嵌入式刷题(day2 new delete 和malloc free的区别)

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

时间:2023-10-22 14:31:39浏览次数:47  
标签:malloc day2 free 运算符 内存 new delete

(文章目录)


前言

本篇文章我们来讲解一下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

相关文章

  • ABB AC900F学习笔记327:WINCC7.5SP2作为OPC SERVER,freelance2019SP2作为OPCC LIENT练习
    这一篇博客我在新浪博客记录过,地址是 ABBAC900F学习笔记327:WINCC7.5SP2作为OPCSERVER,freelance2019SP2作为OPCCLIENT练习_来自金沙江的小鱼_新浪博客(sina.com.cn)为了避免丢失,我在这里再次记录一遍今天做一个练习,WINCC7.5SP2作为OPCSERVER,freelance2019SP2作为OPCCLIENT。......
  • ABBAC900F学习笔记326:freelance2019SP1作为OPC DA SERVER,WINCC7.5SP2作为OPC DA CLIEN
    昨天练习了ABB的OPCDA通过寻,在同一台计算机上实验的。今天测试局域网上freelance2019SP1作为OPCDASERVER,WINCC7.5SP2作为OPCDACLIENT通讯。测试在昨天的ABB练习程序基础上进行。1.freelance2019SP1作为OPCDASERVER,配置DCOM,参考前面WINCC作为DASERVER的配置方法WINDO......
  • ABBAC900F学习笔记325:FREELANCE2019SP1的OPC练习1
    这一篇博客我爱新浪博客发表过,地址是ABBAC900F学习笔记325:FREELANCE2019SP1的OPC练习1_来自金沙江的小鱼_新浪博客(sina.com.cn)我在这里也记录一遍今天在家做一下freelance2019SP1的OPC通讯练习。新建一个freelance项目,插入硬件和软件、OPC网关、OS等,按照以前的练习配置资源......
  • FreeRTOS入门教程(事件组概念和函数使用)
    (文章目录)前言本篇文章将带大家学习什么是事件组以及如何使用事件组。一、事件组概念事件组通常是由一组位(bits)组成的数据结构,其中每一位都对应着某个特定的事件。每个位可以被设置或清除,表示相应的事件发生或未发生。这种位的组合形成了一个类似于二进制数的集合,每个位都代......
  • C++学习笔记Day2
    关于String对象的一些事1.string对象来源于C++标准库<string>,表示一种可变长的字符序列,定义在命名空间std之中。2.string对象无初始值默认为空字符串。3.若是使用等号对string变量进行初始化,属于拷贝初始化,不使用等号,如strings6("hiya");strings7{"11123"};strings8(10,"c......
  • FreeRTOS 原理 --- 临界区(critical section)
    关调度器voidvTaskSuspendAll(void){/*AcriticalsectionisnotrequiredasthevariableisoftypeBaseType_t.PleasereadRichardBarry'sreplyinthefollowinglinktoapostintheFreeRTOSsupportforumbeforereportingthisasa......
  • FreeRTOS 原理 --- 互斥锁
    互斥锁相比于二值信号量,有以下特点:1、通过优先级继承,防止优先级反转2、只有互斥锁持有的线程可以释放互斥锁3、FreeRTOS提供支持递归版本的互斥锁 创建互斥锁互斥锁使用的描述符是队列的描述符,不单独定义互斥锁描述符。初始化时,指定队列的长度 pxNewQueue->uxLength 为......
  • [JOISC 2021 Day2] 道路の建設案 (Road Construction)
    [JOISC2021Day2]道路の建設案(RoadConstruction)题意给定图上\(n\)个点,求前\(k\)小曼哈顿距离点对距离。题解很好的一道题。首先有一个\(O(nlog^2n)\)的做法,个人感觉还是很有启发性的。一般对于第\(k\)小的处理方法是二分,二分第\(k\)小的距离是多少。然后统......
  • CF73D FreeDiv
    首先先把原图中的连通信息求一下,不妨设其中有\(tot\)个连通块,每个连通块的大小为\(sz_i\)考虑第二步操作时我们需要连\(tot-1\)条边使得图连通,而每个连通块中只有\(\min(sz_i,k)\)个点可以参与连边因此如果\(\sum_{i=1}^{tot}\min(sz_i,k)\ge2\times(tot-1)\)的话此时的局面......
  • WPF性能优化:Freezable 对象
    Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象。冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象。Freezable的应用我们定义画刷资源的时候常常会这样写:<SolidColorBrushx:Key="RedBrush"Color="Red"o:Freeze="True"/>......