new/delete的简单使用
#include <iostream>
using std::cout;
using std::endl;
//在C中用来开辟和回收空间的方式是采用malloc/free库函数
//在C++中提供了新的开辟和回收空间的方式,采用new/delete表达式
int main()
{
//开辟一个元素空间
int *p = new int(1);
cout << "*p = " << *p << endl;
delete p;
//开辟一个数组空间,注意使用 []
int *q = new int[10]();
for(int i = 0; i < 10; ++i)
{
q[i] = i;
}
for(int i = 0; i < 10; ++i)
{
cout << "q[" << i <<"] = " << q[i] << endl;
}
// 释放数组空间的时候,注意 []
delete []q;
return 0;
}
new/delete表达式与malloc/free的区别
异
- malloc/free是C/C++的库函数,new/delete是C++的表达式
- new能够自动分配空间大小,malloc需要传入参数
- new开辟空间的同时还对空间做了初始化的操作,而malloc不行
- new/delete能对对象进行构造和析构函数的调用,进而对内存进行更加详细的工作,而malloc/free不能
同
malloc/free,new/delete都是成对出现的,且必须成对出现,否则可能出现内存泄露
new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free?
C++程序要经常调用C函数,而C程序只能用malloc/free管理动态内存
new表达式工作步骤
- 调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象
- 运行该类型的一个构造函数初始化对象
- 返回指向新分配并构造的构造函数对象的指针
delete表达式工作步骤
- 调用析构函数,回收对象中数据成员所申请的资源
- 调用名为operator delete的标准库函数释放该对象所用的内存