简单说明几种程序运行时用于存储变量的内存区域:
第一部分称为静态存储区域:这部分存储空间在程序开始以前就可以分配,且这个存储空间在程序的整个运行期间都存在。例如全局的静态变量就存在这部分内存中。
第二部分被称为栈,栈中包含了带有函数返回地址的活动记录,以及当前函数使用的本地变量。对于一个被调用的子函数来说,函数体是包含在一对花括号中的一系列代码。一旦函数执行完毕,也就是程序执行出了右花括号时,栈空间的存储单元就会被自动释放。
第三部分被称为堆,堆是区别于栈、全局数据区和代码区的另一个内存区域。它允许程序在运行而非编译时,申请某种大小的内存空间。堆的存在为程序设计提供了灵活性,例如,递归的实现就需要语言提供动态内存分配的支持,堆意味着在任何时候分配内存并自适应的决定具体需要多少内存。
尽管为了和C兼容,C++仍保留了malloc和free函数,但在更多的情况下,C++中推荐使用功能呢更强的运算符 new 和 delete
new int ;//开辟一个存放整型变量的空间,返回一个指向整型变量的指针
new int(100);//开辟一个存放整型变量的空间,并指定其初值为100
float *p=new float(3.14159);//开辟一个存放实数的空间,并制定该实数的初值为3.14159,将返回的指向实型数据的指针赋给指针变量p
C++同样可以使用new来为一个数组分配内存空间,并相应地使用delete来将其释放。
Point *pt=new Point[100];
这句代码使用new在堆上创建了一个含有100个对象的数组,并把返回的指针付给了指针变量pt。这样就在堆上为100个Point对象分配了足够的内存并为每一个对象调用了构造函数。
delete pt;
这表示把数组中的第一个对象释放了,也就仅仅为第一个对象调用了析构函数,而对另外99个对象没有调用。
delete []pt;
空的方括号用于告诉编译器从数组创建时存放的地方取回数组种对象数量的代码,并为数组的所有对象调用析构函数。
结构体被释放不代表它的域也被释放了。