深入理解new与delete

new和malloc的区别

首先回答一个面试时经常问到的问题

  • malloc只进行内存空间的开辟,但不进行数据的初始化操作,其内部是按照字节进行内存开辟的,开辟内存时需要指定类型
  • new不仅进行内存空间的开辟,同时会进行数据的初始化操作,因此如果使用new开辟一个自定义的类类型数据,它会自动调用该类的构造函数来对类对象进行数据初始化

  • malloc内存分配失败会返回一个空指针nullptr
  • 而new内存分配失败是通过抛出异常终止程序的

  • malloc是一个c的库函数
  • new是一个运算符

 测试代码

#include<iostream>

int test(){
/*new与malloc常规类型数据创建*/
    int* p=(int*)malloc(sizeof(int));
    if(!p)
        return -1;
    *p=20;
    std::cout<<">>>>"<<*p<<std::endl;
    free(p);

    try{
        int* p1=new int(30);
        std::cout<<"-->"<<*p1<<std::endl;
        delete p1;
    }catch (const std::bad_alloc& e)
    {
        // throw std::bad_alloc();
        std::cerr<<"memory allocation failed: "<<e.what()<<std::endl;
        return -1;
    }

/*new与malloc开辟数组数据空间*/
    int* arr=(int*)malloc(sizeof(int)*20);
    if(arr==nullptr)
        return -1;
    free(arr);

    try{
        //只进行数组的内存开辟,但不进行数据的初始化
        int *arr1=new int[20];
        //既进行数组的内存开辟,同时进行数组数据的初始化
        //但c++11不建议这样写,编译时会报错,如果想通过编译需要加上编译参数-fpermissive
        int *arr2=new int[30](2);
        std::cout<<*(arr2+1)<<std::endl;

        //c++11建议这样进行数组的初始化
        int *arr3=new int[30];
        std::fill(arr3,arr3+30,1);//所有元素初始化为1

        delete arr1;
        delete arr2;
        delete arr3;
    }catch (const std::bad_alloc& e)
    {
        // throw std::bad_alloc();
        std::cerr<<"memory alloction failed: "<<e.what()<<std::endl;
        return -1;
    }
}

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

new有几种类型

int test(){
    /*常规new*/
    int* p1=new int(20);

    /*不抛出异常的new*/
    int* p2=new (std::nothrow) int;

    /*常量new*/
    const int* p3=new const int(40);

    /*定位new,在指定的内存上构造数据*/
    int data=0;
    int *p4=new (&data) int(50);
    std::cout<<"data:"<<data<<std::endl;
    std::cout<<"p4:"<<*p4<<std::endl;
    std::cout<<"&p4>>>"<<&p4<<std::endl;
    std::cout<<"&data>>>"<<&data<<std::endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值