程序的内存模型,new指令

程序执行前

1.代码区

存放CPU执行的机器指令

代码区是共享的,对于频繁执行的代码,在代码区只会存放一份。

代码区是只读的,防止代码被篡改。

2.全局区

存放全局变量,静态变量,常量

局部变量是在函数里的变量  : int a = 1

全局变量可被任何函数使用

静态变量 前加static :static int a= 3

常量 (1)字符串常量:"hello world"

           (2.1)const 修饰的全局变量 :const int a

            (2.2)const 修饰的局部变量:const int b

程序执行后出现的

1.栈区

由编译器自动分配释放,函数的参数值,局部变量,形参

注意事项:不要返回局部变量的地址,因为栈区开辟的地址会自动释放

int * func()       //因为这里返回的是一个指针,所以int *
{
    b = 100;  //形参
    int a = 10;
    return &a;
}

int main()
{
    int *p = func();
cout << *p << endl;    //第一次输出10
cout << *p << endl;    //第二次输出乱码,因为第二次这个数据不再被保留了,func()运行完地址就被释放了
}

4.由程序员分配,若没释放,由系统释放

主要用new 开辟内存

int * func()       //因为这里返回的是一个指针,所以int *func() = int *p 为一个确定值
{
   int *p  =  new int(10) //在堆区开辟内存,赋予这地址一个整型的值,将地址存到指针变量中
//指针还是一个局部变量,在栈区存的是一个地址编号0x0001,指针所保存的数据在堆区,堆区的数据编号为0x0001
    return p;
}

int main()
{
    int *p = func();
cout << *p << endl;    //第一次输出10
cout << *p << endl;    //第二次输出10,因为堆区的数据由程序员管理,不自动释放
}

5.NEW操作符

c++利用new操作符在堆区开辟数据,释放数据 delete p

堆区开辟数组,释放数组的特殊形式 delete[] arr

有程序员手动开辟,手动释放,释放操作符 delete

语法:new 数据类型

p代表地址,*代表指向,*p代表实际值

void test01()
{
	double *p = func();
	cout << *p << endl;
	cout << *p << endl;
	delete p;  //可以用delete 将地址释放
	//cout << *p << endl;   //内存已释放,访问非法,报错
}

void test02()   //堆区开辟数组
{
	int * arr = new int[10];   //代表创建了一个有十个元素的数组,名字无所谓,也可叫p
	for (int  i = 0; i < 10; i++)
	{
		arr[i] = i + 10;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
	delete[] arr;  //加[]表明释放的是数组

}

int main()
{
	test01();

	test02();

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值