在 C++中堆内存的分配和释放是通过 new 和 delete 来操作的。使用方式如下
开辟内存: 类型* 指针变量名 = new 类型(初始化数值);
释放内存: delete 指针变量名;
new的三种调用规则:
int main()
{
int* p = new int(10); // 运算符
int* s = (int*)::operator new(sizeof(int)); // 函数
new(s) int(10); // placement new 定位 new, 置位 new
delete p;
operator delete(s);
return 0;
}
new的具体使用:
int main()
{
int *ap = new int(10);//关键字 *ap = 20;
cout << *ap << endl;
delete ap;
ap = NULL;//释放空间后要指向空
//int *bp = new int[10](10);//遵循C11标准的编译器
//可以办到,开辟空间,同时将每个空间初始化
int *bp = new int[10];
delete[] bp;
int *cp = (int *)::operator new(sizeof(int));
new(cp) int(10);//不开辟空间,只是将指针指向的空间改值
//称为定位new或者置位new
cout << *cp << endl;
operator delete(cp);
return 0;
}
释放空间后,空间还给系统,空间里的值变成随机值,但是指针还是指向空间,要进行指针指向空,否则可能继续修改原指向空间的值
如下
int main()
{
int *ap = new int(10);
int *bp = ap;
cout << *ap << '\t' << *bp << endl;
delete ap;
*ap = 20;
cout << *ap << '\t' << *bp << endl;
return 0;
}
运行截图
new和delete与malloc和free的区别:
int *ap = new int(10)中new是关键字,而malloc是函数并且malloc只能申请空间,不能初始化,申请失败返回NULL指针;new申请空间的时候可以进行初始化, 申请失败会抛出异常。