动态分配内存new和delete

动态分配内存new和delete

栈:存储局部变量、函数参数和返回值。
栈区的效率很高,但是空间很小,如果需要处理大量的数据,就必须使用堆区的内存

动态分配内存new和delete
使用堆区的内存有四个步骤:
1)声明一个指针;
2)用new运算符向系统申请一块内存,让指针指向这块内存;
3)通过对指针解引用的方法,像使用变量一样使用这块内存;
4)如果这块内存不用了,用delete运算符释放它。
申请内存的语法:new 数据类型(初始值); // C++11支持{}

如果申请成功,返回一个地址;
如果申请失败,返回一个空地址(暂时不考虑失败的情况)。

释放内存的语法:delete 地址;
释放内存不会失败(还钱不会失败)。
注意:

  • 动态分配出来的内存没有变量名,只能通过指向它的指针来操作内存中的数据。
  • 如果动态分配的内存不用了,必须用delete释放它,否则有可能用尽系统的内存。
  • 动态分配的内存生命周期与程序相同,程序退出时,如果没有释放,系统将自动回收。
  • 就算指针的作用域已失效,所指向的内存也不会释放。
  • 用指针跟踪已分配的内存时,不能跟丢。

二级指针

指针是指针变量的简称,也是变量,是变量就有地址。
指针用于存放普通变量的地址。
二级指针用于存放指针变量的地址。
声明二级指针的语法:数据类型** 指针名;
使用指针有两个目的:1)传递地址;2)存放动态分配的内存的地址。
在函数中,如果传递普通变量的地址,形参用指针;传递指针的地址,形参用二级指针。
把普通变量的地址传入函数后可以在函数中修改变量的值;把指针的地址传入函数后可以在函数中指针的值。
#include
using namespace std;

//使用堆区的内存有四个步骤:
//1)声明一个指针;
//2)用new运算符向系统申请一块内存,让指针指向这块内存;
//3)通过对指针解引用的方法,像使用变量一样使用这块内存;
//4)如果这块内存不用了,用delete运算符释放它。

实例:


```cpp
void func(int **pp)
{
	*pp = new int(30);//对**pp一级解引用就是p_a
	cout << "pp=" << pp << "\n*pp=" << *pp << endl;


}

int main()
{
	//动态分配出来的内存没有变量名,只能通过指向它的指针来操作内存中的数据。
	/*int *p = new int(5);

	cout << "*p=" << *p << endl;


	*p = 8;

	cout << "*p=" << *p << endl;


	delete p;


	int i = 8;
	cout << "i=" << i<<"     i的地址="<<&i<< endl;
	int *p_i = &i;
	cout << "*p_i=" << *p_i << "     p_i的地址=" << p_i << endl;

	int **pp_i = &p_i;
	cout << "**pp_i=" << *pp_i << "     pp_i的地址=" << pp_i << endl;*/
	
	
	int *p_a=0 ;//初始值
	//cout << "*p_a=" << *p_a <<"p_a的地址"<<p_a<< endl;

	//在函数中分配内存,并且把指针变量p_a的地址传递给函数
	func(&p_a);

	cout << "*p_a=" << *p_a << endl;


	system("pause");
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love coldplay

你的鼓励,将让我持续更新

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值