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++的会调用构造和析构函数

posted @   CodeMagicianT  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示