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;
}