18.申请堆区空间和释放堆区空间
1.申请和释放变量空间
1.为什么要有新的方法申请和释放堆区空间
因为用C语言的方式不会调用构造和析构函数
2.C++中申请堆区空间和释放堆区空间用什么关键字
申请堆区空间用new,释放空间用delete
class Maker
{
public:
Maker()
{
cout << "构造函数" << endl;
}
Maker(int a)
{
cout << "有参构造函数" << endl;
}
~Maker()
{
cout << "析构函数" << endl;
}
};
void test02()
{
//用new方式申请堆区空间,会调用类的构造函数
Maker *m = new Maker;
//释放堆区空间,会调用类的析构函数
delete m;
m = NULL;
Maker *m2 = new Maker(10);
delete m2;
m2 = NULL;
}
2.申请和释放数组空间
1.new创建基础类型的数组
void test01()
{
//申请基础数据类型的数组
int *pInt = new int[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//不推荐
for (int i = 0; i < 10; i++)
{
pInt[i] = i + 1;
}
for (int i = 0; i < 10; i++)
{
cout << pInt[i] << " ";
}
cout << endl;
char *pChar = new char[64];
memset(pChar, 0, 64);
strcpy(pChar, "小话");
cout << pChar << endl;
//注意:如果new时有中括号,那么delete时也要有中括号
delete[] pInt;
delete[] pChar;
}
2.new创建对象数组
class Maker
{
public:
Maker()
{
cout << "构造函数" << endl;
}
Maker(int a)
{
cout << "有参构造函数" << endl;
}
~Maker()
{
cout << "析构函数" << endl;
}
};
void test02()
{
Maker *ms = new Maker[2];//调用无参构造
delete[] ms;
//大部分编译器不支持这种写法,(聚合初始化)
//Maker *ms2 = new Maker[2]{Maker(10), Maker(20)};
}
3.delete void*可能出错,不会调用对象的析构函数
void test03()
{
void *m = new Maker;
//如果用void*来接new的对象,那么delete时不会调用析构函数
delete m;
//在编译阶段,那么编译器就确定好了函数的调用地址,
//C++编译器不认识void*,不知道void*指向那个函数,所以不会调用析构函数
//这种编译方式叫静态联编
}
4.C和C++的申请和释放堆区空间不要混用
3.和C的共同和区别之处
共同:都是申请堆区空间和释放堆区空间
区别:C++的会调用构造和析构函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)