动态内存和指针的个人理解

1.动态内存的创建

动态内存首先是通过new关键词或者malloc函数在堆区开辟出一块固定的内存大小(一般局部变量都是在栈区存放的)

2.动态内存与指针

使用new得到的指针与其他指针并没有什么不同,可以将new出来的指针赋值给普通指针,并且可以用函数返回一个new指针,并在函数之外去delete也可以。

程序如下

int* cal(int a, int b)
{
	int* res = new int[4];
//res指针只在这个子程序中有效,是一个局部指针,当这个子程序结束,该指针变量也会被释放,但是指向的动
//态内存会跟着返回值返回给主程序中的指针,如果主程序没有接受返回值,就会导致内存溢出。
	res[0] = a + b;
	res[1] = a - b;
	res[2] = a*b;
	res[3] = a / b;
	return res;
}


int main(void)
{
	int *a;
	a = cal(4, 2);
	cout << a[0] << endl;
	cout << a[1] << endl;
	cout << a[2] << endl;
	cout << a[3] << endl;
	delete[] a;
	system("pause");
	return 0;
}

如果有多个指针指向同一片动态内存,只需要delete一个指针即可,如果delete第二个指向同一片内存地址的指针,那么程序就会崩溃(一直在无休止的运行)。

错误程序示例:

int* cal(int a, int b)
{
	int* res = new int[4];
	res[0] = a + b;
	res[1] = a - b;
	res[2] = a*b;
	res[3] = a / b;
	return res;
}


int main(void)
{
	int *a;
	int *b;
	a = cal(4, 2);
	b = a;
	cout << a[0] << endl;
	cout << a[1] << endl;
	cout << a[2] << endl;
	cout << a[3] << endl;
	cout << a << endl;
	delete[] a;
	cout << a << endl;//内存空间删除,指针还存在,但是不再指向原地址了
	cout << b[0] << endl;
	cout << b[1] << endl;
	cout << b[2] << endl;
	cout << b[3] << endl;
	cout << b;
	delete[] b;//执行到此处就一直运行而没有结果,因为该内存地址已经删除了
	system("pause");
	return 0;
}

3.动态内存的释放

通过delete关键词或者free函数来释放栈区的动态内存,其实就是将指针指定的动态内存的控制权交还给CPU,允许CPU能够重新将这块动态内存给分配出去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值