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

#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];
    //开辟一个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;
}

猜你喜欢

转载自blog.csdn.net/tulipless/article/details/80492075
今日推荐