//new和delete的用法
#include<iostream>
#include<cstdlib>
using namespace std;
/*1:new和delete 操作符是C++的语法,像C语言中的malloc 和 free关键字;
malloc和free是C语言的函数,new和delete是C++的操作符,这两个意义不一样。
2: 利用new可以进行这些操作::基础类型变量,分配数组变量,分配类对象。
3:new 运算符动态分配堆内存
使用形式:指针变量=new 类型(常量)
指针变量=new 类型【表达式】
作用:从堆分配一块“类型”大小的存储空间,返回首地址。
其中:“常量”是初始化值,可缺省
创建数组对象时,不能为对象指定初始值。
delete运算符释放已分配的内存空间
使用形式:delete 指针变量;
delete【】指针变量
其中:"指针变量必须是一个new返回的指针" */
//new分配基础类型的
int main01()
{
int *p=(int *)malloc(sizeof(int)); *p=10;
free(p);//C语言中分配内存,并且为这个指针变量赋值
int *p2=new int; *p2=20;
free(p2);//C++中new关键字 分配基础类型的用法,随后进行赋值
int *p3=new int(30);
delete p3; //在分配基础类型时候,直接进行初始化 ,在C语言中用free进行释放,
// 而在C++中也可以用delete释放,基础类型直接是delete加上指针变量名;
cout<<"hello"<<endl;
return 0;
}
//new分配数组变量
int main02()
{
//C语言中分配数组
int *p=(int *)malloc(sizeof(int)*10);//==int array[10];
p[0]=1; free(p) ;//C++中释放直接用free;
//C++中分配数组
int *parray=new int [10];
parray[1]=2;
delete [] parray; //C++中用delete释放内存不要忘了[]符号。
char *parray2=new char[20];
delete [] parray2;
cout<<"hello"<<endl;
return 0;
}
class test
{
private:
int a;
public:
test(int _a)
{
a=_a;
}
protected:
};
//分配类对象
int main03()
{
//c
test *pt1=(test *)malloc(sizeof(test));//malloc可以malloc类这种类型的
free(pt1);
//C++
test *pt2=new test(10);//new可以自动调用类写的构造函数
delete pt2; //delete操作符能执行类 的析构函数
cout<<"hello"<<endl;
return 0;
}
/* 请问:用new分配的内存可以用free释放吗?
用malloc分配的内存可以用delete释放吗? */
//1:分配基础类型的时候
int main04() //基础类型的时候,用new和malloc混搭是没有问题的;
{
int *p=(int *)malloc(sizeof(int)); *p=10;
delete p;
int *p2=new int; *p2=20;
free(p2);
}
//2:分配数组类型的时候
int main05() //下面的为int类型的数组,所以用new和malloc也是没有问题,但是如果是test、类,则结果另当别论
{
int *p=(int *)malloc(sizeof(int)*10);
p[0]=1; delete []p;
int *parray=new int [10];
parray[1]=2;
free(parray);
}
//分配类对象的时候
//malloc 和free 属于C语言的函数,他不会调用这个类构造函数,他只会分配内存大小
//但是new不光可以分配内存,还可以调用构造函数,来完成对对象的初始化
//new和malloc的最大区别,new可以初始化对象,malloc不行
//delete不光可以释放内存,还可以调用析构函数,而free不会调用析构函数
int main()
{
test *pt1=(test *)malloc(sizeof(test));
delete pt1;
test *pt2=new test(10);
free(pt2);
}
/*结论:
malloc不会调用类的构造函数;
free不会调用类的析构函数*/