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);
}
这里就不介绍其他的了,我们定义了一个宏,安全释放指向数组的指针