new和delete
C语言中使用的是malloc动态开辟内存,用free销毁内存。
//C语言malloc、free
int main()
{
//①
int *p1=(int *)malloc(sizeof(int));
free(p1);
//②
int *p2 = (int *)malloc(sizeof(2));
free(p2);
}
以上代码可以发现,①是malloc正常开辟和销毁的方法,②中可以发现是sizeof(2),int占4字节,但其实②中这两行代码实现的过程是不报错、可以运行成功的。但是如果修改成以下这样:
int *p2 = (int *)malloc(sizeof(2));
*p2 = 10; //error
free(p2);
则会报错,因为会越界:mov dword ptr[p2],0ah
错误示例:
//错误示例
int main()
{
int *p2 = (int *)malloc(2);
int a = (int)p2;
p2 = (int *)++a;
free(p2); //error
}
C++语言中使用new动态开辟,delete释放内存
//C++使用new、delete
int main()
{
int *p3 = new int;//系统自动计算大小
delete p3;
}
new和malloc的区别
1、new开辟的内存叫自主存储区域,malloc则在堆区开辟。
2、malloc()是一个函数,new是关键字。
3、malloc()无法初始化,仅仅开辟内存,new可以开辟内存并且初始化。
4、C语言如果开辟失败会报错,C++若开辟失败,抛出异常,终止程序。
5、常量开辟一定要初始化,否则无意义;malloc不能开辟常量内存,new可以。
开辟数组
//C语言
int *p1 = (int *)malloc(sizeof(int)*10);
free(p1);
//C++
int *p2 = new int[10];
delete [] p2;
//C++可以开辟内存并初始化
int *p3 = new int(10);
cout<<*p3;//10 开辟内存并初始化为10
delete p3;
//0初始化
int *p4 = new int[10]();
delete p4;
const int *p5 = new const int(10);
delete p5;
开辟二维数组
C语言方法:
//开辟二维数组
//C语言
int main()
{
int **p1 = (int **)malloc(sizoeof(int *)*10);
for(int i=0;i<10;i++)
{
p1[i]=(int *)malloc(sizeof(int)*10);
}
for(int i=0;i<10;i++)
{
free(p1[i]);
}
free(p1);
}
C++方法:
//C++
int main()
{
int **p2 = new int*[10];
for(int i=0;i<10;i++)
{
p2[i]=new int[10];
}
for(int i=0;i<10;i++)
{
delete [] p2[i];
}
delete []p2;
}