知识点1-2

本文详细对比了C++中new/delete与malloc/free的区别,包括它们在内存分配与释放、构造与析构函数调用等方面的差异,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本博客长期更新

1、int a = 0 and int a(0) 的区别

没有区别
参考两个网站 SO1SO2


2、new/delete和malloc/free的区别
相同点:均可用于申请动态内存和释放内存
不同点:
(1)操作对象不同
malloc/free是c++标准库函数,而new/delete是c++的运算符。对于非内部数据类的对象而言,仅仅使用malloc和free不能满足动态对象的要求。此外,对象在创建同时要自动执行构造函数,消亡时候要执行析构函数;由于malloc和free是库函数而不是运算符,无法把执行构造和析构函数任务强加于malloc和free身上。
(2)用法上不同
——-函数malloc的原型

void *malloc(size_t size)

用malloc申请长length的整形内存,程序如下

int p=(int )malloc(sizeof(int)*length);

有两点需注意:1、强制类型转换 2、sizeof
(一)void*表示未确定类型的指针,需要进行类型转换,讲void*转换成需要的指针类型
(二)malloc并不关心要申请的内存是什么类型,只关心长度是多少


——-函数free的原型

void free(void *memblock)
指针的类型及所指内存的容量事先知道,p是NULL,free(p)不会出错,如果不是NULL,连续free 两次会编译出错


——-函数new的原型

int*p=new int[length]
int p2=(int )malloc(sizeof(int)*length)

new内部覆盖了sizeof、类型转换和类型检查等问题。
对于非内部对象而言,new语句如下:

obj * object=new obj[100];
不能写成obj *object=new obj[100] (1);

——-函数delete
delete释放对象数组,不可遗漏[]

delete []object;// right
delete object;//wrong 还有99个没有清空


总结:

  • new自动分配空间,而malloc需要手动计算
  • new是安全的,malloc性能不高
    int *p=new float[2];//编译时指出错误
    int p2=(int)malloc(sizeof(float)*len);//无法指出错误
    其实new操作分两步走,分别是operator new,再就是constructor
  • operator new对应malloc,但operator new可以重载,可以自定义内存分配策略,甚至不分配内存,而malloc不行
  • new将会调用constructor,malloc不能;delete将调用deconstructor,free不能
  • malloc/free需要库函数支持,new不需要。

例子:

class Obj{
public:
    Obj()   {
        cout << "Initialization1" << endl;
    }
    ~Obj() {
        cout << "Destroy1" << endl;
    }
    void Initialize()   {
        cout << "Initialization2" << endl;
    }
    void  Destroy() {
        cout << "Destroy2" << endl;
    }
}obj;

void  UseMallocFree(){
    Obj   * a = (Obj  *)malloc(sizeof(obj));      //  allocate memory 
    a->Initialize();                                    //  initialization
                                                        // … 
    a->Destroy();                                        // deconstruction 
    free(a);                                               // release memory
}

void  UseNewDelete(void){
    Obj   * a2 = new  Obj;
    // … 
    delete a2;
}


int main() {
    UseMallocFree();
    return 0;
}

这里写图片描述

如果main函数执行另外一个:

int main() {
    UseNewDelete();
    return 0;
}

这里写图片描述



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值