C++动态内存分配

1.为什么要使用动态内存分配

我们知道,.net和Java创建对象的时候都会使用new一个对象,只不过不需要我们进行释放,它们都有垃圾回收机制。而C++也是使用new来分配内存空间,但要手动使用delete来进行内存的释放
平常,我们也可以不使用new照样可以。那么我们为什么要使用new来操作呢,有什么好处??

任何一类编程语言都分为4类内存区域:
有代码区,静态变量和全局变量区,局部变量区(栈),还有动态存储区(堆)、其中比如我们创建一个变量指针什么的,都是在栈中划分一块内存区域进行存储。而栈,有先进后出的原则,它是由顺序的,效率高,但是体积小。可能一台普通PC机只有几M的空间。我们如果要读一个10多M的文件存放在字符串中,那样栈肯定会被撑爆的。

而堆,是一块很大很大的内存区域,它是无序的,可以自由存储,你只要知道属于你那块区域的内存地址即可。而我不使用new默认是在栈中,使用new就会在堆中创建内存区域、


2.详解动态内存分配机制


说了好处,为什么要使用new之后,那么我们来看看在实际中是如何运用的吧!普通的类型就不演示了,直接看指针和数组之间的动态分配

#include <iostream>
int main()
{
	using namespace std;
	int* pInt=new int[10];
	for (int i = 0; i <10; i++)
	{
		*(pInt+i)=i+10;
	}
	//delete [] pInt;
	for (int i = 0; i <10; i++)
	{
		cout<<*(pInt+i)<<endl;
	}
	delete [] pInt;
}

我们创建了pInt的指针指向了数组,然后我们使用循环变量对每块区域进行赋值。之后我们在循环输出,最后delete []  释放。程序很简单,但有几个问题是必须要理解的

1.使用new分配  delete释放  如果是数组则使用delete []

2.我们把注释的那行释放开,最后在注释掉后面的那个delete,输出的结果就是随机值了,因为,我们先释放了我们需要的那块内存区域,而指针pInt依然还是指向那块区域的
   只不过那块区域已经变为空闲区域了,我们原来存的值已经清空了而已。所以,我们释放完后还应该把pInt赋值为0

3.我们也可以把循环中的10改为超过new int[10]。这样依旧不会发生越界的行为,其实指针可以指向超出我们new的内存区域,可能这块区域其他程序在用,又或者是空闲,所以里面的值也是不可预料的


<pre name="code" class="cpp">#include <iostream>
using namespace std;
#define SAFE_DELETE_ARRAY(p) if(p){delete [] p;p=0;}
int main()
{
	int* p=new int[1];
	SAFE_DELETE_ARRAY(p);
}


 这里就不介绍其他的了,我们定义了一个宏,安全释放指向数组的指针 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值