【c++】浅析new和delete关键字

       new和delete是在c++中用来动态开辟和释放内存的关键字;这就不得不提起在c中经常使用的malloc函数和free函数开辟和释放内存;

目录

一、那么,首先回顾一下malloc和free的用法定义和特点:

二、接下来,我们看看c++中new和delete关键字的定义和特点;

三、那么,我们来看一下new和delete的具体使用:

四、重定位new:


一、那么,首先回顾一下malloc和free的用法定义和特点:

定义:

    malloc函数原型:void * malloc(size_t size);用来在堆上动态开辟内存;

    free函数原型:void free(void *ptr);用来释放内存;

动态开辟的特点:

    1.堆上开辟;

    2.是一个函数;

    3.不可初始化;

    4.开辟失败,指针放回空;

    5.不能开辟常量内存块;

例如:

    int *p1 = (int*)malloc(sizeof(int));

    free(p1);

二、接下来,我们看看c++中new和delete关键字的定义和特点;

定义:

    new:用来动态开辟内存

    delete:用来释放空间以及资源;

动态开辟的特点:

    1.在自主存取区域内开辟;

    2.是一个关键字;

    3.可初始化;

    4.开辟失败后,会抛出异常;

    5.可开辟常量内存块;

例如:int *p2 = new int(10); //初始化为10;

            delete p2;

三、那么,我们来看一下new和delete的具体使用:

1、动态开辟一维数组:

    (1)c中malloc开辟

 int *p = (int *)malloc(sizeof(int)*10);
 free(p);

    (2)c++中new开辟

    int *p3 = new int[10];//动态开辟一个长度为10的数组
    delete [] p3;
    
    int *p4 = new [10]();//动态开辟一个长度为10的数组并初始化为0
    delete [] p4;
    
    const int *p5 = new const int (10);//开辟常量内存块,且一定要初始化,这里初始为10
    delete [] p5;
    
    const int p6 = new const int[10]();
//动态开辟常量数组并初始化为0  可以开辟成功,但一般情况不用,因为这里的数组值全为0 ,并且不能对其进行修改
    delete [] p6;

2、动态开辟二位数组

(思路:先开辟一维数组,再在所开辟的一位数组的基础上再循环开辟)

    (1)c中使用malloc开辟

    int **p = (int **)malloc(sizeof(int *)*10);
    for(int i = 0;i < 10;i++)
    {
        p[i] = (int*)malloc(sizeof(int)*10);
    }
    for(int i = 0;i < 10;i++)
    {
        free(p[i]);
    }
    free p;

    (2)c++中使用new开辟

    int **p1 = new int *[10];
    for(int i = 0;i < 10;i++)
    {
        p1[i] = new int [10];
    }
    for(int i = 0;i < 10;i++)
    {
        delete[] p1[i];
    }
    delete[] p1;

四、重定位new:

    int a;

    char *p = new(&a)char('a');

    在a的内存池中,开辟一块内存给p使用,即p指向该内存,此时内存为char型

    将a的内存称为内存池,可以自主管理内存;如图所示:


    

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,`default`和`delete`关键字具有以下作用: 1. `default`关键字:用于指示编译器生成默认的特殊成员函数的实现。当类声明了特殊成员函数(如默认构造函数、拷贝构造函数、拷贝赋值运算符、析构函数)但没有提供具体的实现时,可以使用`default`关键字告诉编译器生成默认的实现。默认构造函数创建对象时不执行任何操作,拷贝构造函数用于对象的拷贝初始化,拷贝赋值运算符用于对象的赋值操作,析构函数用于对象的销毁。 示例: ```cpp class MyClass { public: // 使用default关键字声明默认构造函数 MyClass() = default; // 使用default关键字声明拷贝构造函数 MyClass(const MyClass& other) = default; // 使用default关键字声明拷贝赋值运算符 MyClass& operator=(const MyClass& other) = default; // 使用default关键字声明析构函数 ~MyClass() = default; }; ``` 2. `delete`关键字:用于禁止编译器生成特殊成员函数或某个特定的重载函数。通过使用`delete`关键字,可以显式删除某个特殊成员函数的默认实现,使其在编译时变为不可用。也可以通过删除某个特定的重载函数,阻止其在特定情况下的使用。 示例: ```cpp class MyClass { public: // 使用delete关键字删除默认构造函数,禁止通过无参构造函数创建对象 MyClass() = delete; // 使用delete关键字删除拷贝赋值运算符,禁止对象的赋值操作 MyClass& operator=(const MyClass& other) = delete; // 删除某个特定的重载函数 void func(int) { ... } void func(double) = delete; // 禁止使用double类型参数的func函数 }; ``` 需要注意的是,`default`和`delete`关键字只能用于特殊成员函数,而不能用于普通成员函数或其他类型的函数。此外,`delete`关键字还可以用于删除特定的重载函数,通过对函数的参数列表进行删除,使得该函数在特定情况下不可用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值