c++new、delete与malloc、free对比

本文详细对比了C++中new/delete与C语言中malloc/free的区别,包括如何在堆中分配和释放不同类型的数据,如基本类型、类对象及数组,并强调了new/delete在类对象管理上的优势。

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

#define _CRI_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

class Test
{
public:
    //new可以触发构造函数,且可以为构造函数传参,malloc不能触发构造函数
    Test(int a, int b)
    {
        my_a = a;
        my_b = b;
    }
    //delete可以触发析构函数,free()不可以触发析构函数
    //析构函数的作用和delete的作用不能弄混淆,析构函数是把由对象创建出来的存在堆里的空间释放掉,delete的作用是把堆空间的对象释放掉,它们释放的空间是完全不同的
    ~Test()
    {
        cout << "~Test()" << endl;
    }
private:
    int my_a;
    int my_b;
};

//c语言中
void test1()
{
    //在堆中申请了空间
    int *p = (int *)malloc(64);
    //delete p;malloc出来的空间时可以用delete释放的

    //释放刚刚申请的空间
    if (p != NULL)
    {
        free(p);
        p = NULL;//同时需要使指针p指向NULL
    }
        
}
//c++中
void test2()
{
    //这里的new本质是运算符,new后面加数据类型,表示在堆中开辟这个数据类型大小的空间
    //new与malloc效果相同,都是返回的是地址空间,所以用它们给变量进行赋值,这个变量必须为指针,new与mmalloc本质是完全不同的,malloc是函数,new是运算符
    int *p = new int;
    //free(p);new出来的空间也可以用free函数释放

    //开辟数组,下面一段代码是为指针array开辟一块int[10]大小的堆空间,这里的10是数组长度,并不指数组下标
    int *array = new int[10];//new出来的数组只能用指针去接收,不能像c语言中那样用数组去接收,例int array[] = new int[10]这是错误的
    //开辟一个int类型大小空间并赋值10
    int *array_int = new int(10);
    for (int i = 0; i < 10; i++)//i的作用范围只在这个for循环中,循环结束i就被释放
    {
        array[i] = i;
    }

    if (p != NULL)
    {
        delete p;//这是释放一般变量的堆空间
    }
    if (array != NULL)
    {
        delete[] array;//这是释放数组的堆空间,一定要加[],delete[] array;
    }

    //new和malloc申请的堆空间都可以互相被delete和free释放掉,说明new和malloc实现的原理是相似的,但malloc在为类申请堆空间的时候存在很大缺陷
    //下面一段代码虽然在堆空间创建了一个对象t1,但是t1只有有参构造函数,它没有办法调用有参构造函数来给对象初始化
    Test *t1 = (Test *)malloc(sizeof(Test));
    //new运算符就可以合理直接的调用有参构造函数在堆空间创建对象,当类有多个构造函数时,new也可以通过参数直接一一调用,不存在歧义
    Test *t2 = new Test(10, 20);//这种只适用于类,不适用于数组
    delete t1;//t1是堆空间对象的指针,不是对象,delete释放的是t1所指向的对象,析构函数释放的是t1指向的对象中的指针变量指向的堆空间
    delete t2;
}

//堆空间是在程序结束的时候可以被系统自动回收
int main()
{
    //new和delete是运算符,并不是函数名,new和delete相当于sizeof,+,-等运算符
    //new和delete是在堆空间进行操作,而之前对象的创建是在栈空间
    test1();
    test2();
    return 0;
}
//new和delete的用法总结:
/*
    1.new是返回的是指针,一定要用指针去接收,不可以用数组,例int array[]=...
    2.建立和删除一般类型时
    例 int *p = new int; delete p; char *p = new char; delete p;
       int *p = new int(10);这是创建一个int型变量,并直接赋值为10
    3.建立和删除类的对象时
    例 Test *p = new Test(10, 20);new需要调用构造函数,没有满足构造函数的形式是不可以new的,delete p;
    4.建立和删除数组时
    例 int *p = new int[10];这是建立长度为10的int类型数组,delete[] p;
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值