c++学习:自由存储

前言

个人理解来说,c++中的自由储存就像是手机中的运行内存一样。当打开一个APP时,其实就是向运行内存申请一块可以随时改变大小的内存,再结束使用后,需要在后台将APP结束运行,释放内存。否则,手机运行起来就会卡顿。由于C++不会自动删除用new 申请的内存,故需要手动delete 内存,否则在一次程序运行过程中,自由内存完全使用,将无法申请新的内存,程序运行就会出错。

new操作符的使用

由来:简单的指针应用

一个简单的例子:
例一:

int main()
{
	int a = 10;
	int* p = &a;
	cout << *p;
}

这是指针的最基础的应用,为变量a 起别名,通过提领操作符* 以另一种形式输出a。由此我们可以知道,程序中的变量可以不需要标识符(例如:a),可以直接使用地址对变量进行操作(ps:一种高效的用法,尤其是储存结构体数组)。

无标识符的变量

例二:

int main()
{
	int* p = new int;
	*p = 10;
	cout << *p;
}

这个例子输出结果和上个例子一致,但唯一不同的是没有了标识符a。

操作符new

个人理解,C++中的操作符其实就是一个函数调用的另一种形式。new后接数据类型,在自由储存中申请内存,生成新的无名变量,并返回变量的指针。

与例一区别

首先是指针p指向的内存位置不同,例一中,指针p指向a,而a是由 int 声明的,故p 指向一块普通内存,而例二中的指针p指向的是在自由存储中的动态变量。

new操作符的应用:动态数组

例三:

int main()
{
	int size;
	cin >> size;
	int* p = new int[size];
	for (int i = 0; i < size; i++)
		p[i] = i;
	for (int i = 0; i < size; i++)
		cout << p[i];
}

其实静态数组比如:
int a[10];
中的a其实也是一个指针,指向数组中的第一个元素。这里的a[10]是一个普通变量(自动变量)在程序开始时候申请内存,故其大小10,要提前声明。
而动态数组p 在程序运行过程中,用new向自由内存中申请大小为size的内存,故其size 可以在程序运行过程中输入。剩下的用法就和静态数组一样了。(ps: 数据结构vector的实现其实也就是运用动态数组大小可以在运行过程中改变的特性)

应用:二维动态数组

这里不再多说,诸位看看例子即可,只要理解二位数组的基类型是一维数组即可
例:

int main()
{
	int** a= new int* [4];
	for (int i = 0; i < 4; i++)
	{
		int* row = new int[4];
		a[i] = row;
	}
	for (int i = 0; i < 4; i++)
		for (int j = 0; j < 4; j++)
			 a[i][j]=i*j;
	for (int i = 0; i < 4; i++)
		for (int j = 0; j < 4; j++)
		{
			cout << a[i][j]<<" ";
			if (j==3)
			{
				cout << endl;
			}
		}
	return 0;
}

delete 操作符的应用

在前言中已经说到,自由存储的总大小是固定的,用一次new少一次。故在每一次动态指针使用完毕后,都要进行删除操作。

删除动态指针

例四:

int main()
{
	int* p = new int;
	*p = 10;
	cout << *p;
	delete p;
}

删除动态数组

例五:

int main()
{
	int size;
	cin >> size;
	int* p = new int[size];
	for (int i = 0; i < size; i++)
		p[i] = i;
	for (int i = 0; i < size; i++)
		cout << p[i];
	delete[] p;                         //这里有方括号 !          
	return 0;
}

删除二维动态数组

删除二维动态数组多一步,首先需要一个for循环删除基类型的一维动态数组,在删除二维数组,为了节省空间,这里只粘delete的操作。

	for (int i = 0; i < 4; i++)
		delete[]  a[i];
	delete[]   a;

总结

使用指针直接对内存直接进行访问,这是C++进行底层系统、应用开发的个优势。在写程序中,对于事先不知道对象的个数的情况(比如说迷宫节点的个数),可以使用new新建任意个。虽然对于小程序来说,自由存储的大小足够使用,但要在析构函数中使用delete释放内存。这是个好的编程习惯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值