到目前为止,所讲解的每个示例程序在完成它的任务时所使用的内存空间都是固定不变的。不能在程序运行期间动态增加或减少内存空间(即静态内存)。
在很多时候,需要存储的数据量到底有多大在事先往往是一个未知数,想要处理好这类情况,就需要在C++程序里使用动态内存。
动态内存由一些没有名字、只有地址的内存块构成,那些内存块是在程序运行期间动态分配的。他们来自一个由标准C++库替你管理的大池子(内存池),从内存池申请一些内存需要用到new语句,它将根据你提供的数据类型分配一块大小适当的内存。
new语句返回的内存块很可能充满“垃圾”数据,所以我们通常先往里边写一些东西覆盖,再访问它们,或者在类直接写一个构造器来初始化。
在使用动态内存时,最重要的原则是每一条new语句都必须有一条与之配对的delete语句,否则将导致内存泄漏。
delete语句只释放给定指针变量正指向的内存块,不影响这个指针。在执行delete语句之后,那个内存块被释放了,但指针变量还依然健在。
实例:动态内存管理
1 #include <iostream>
2 #include <string>
3
4 using namespace std;
5 class Company
6 {
7 public:
8 Company(string theName);
9 virtual void printInfo();//需要打印的一些信息
10
11 protected:
12 string name;
13 };
14 Company::Company(string theName)//基类构造函数实现
15 {
16 name = theName;
17 }
18 void Company::printInfo()
19 {
20 cout << "这家公司的名字叫:" << name << "。\n";
21 }
22
23 class TechCompany:public Company
24 {
25 public:
26 TechCompany(string theName,string product);
27 virtual void printInfo();//定义为虚方法,为了使科技公司类中的打印函数能够覆盖基类的打印函数
28
29 private:
30 string product;
31 };
32 TechCompany::TechCompany(string theName,string product):Company(theName)//子类构造函数实现
33 {
34 this->product = product;
35 }
36 void TechCompany::printInfo()
37 {
38 cout << name << "公司大量生产了 " << product << "这款产品!\n";
39 }
40
41 int main()
42 {
43 Company *company = new Company("APPLE");//定义一个基类对象compnay,为其分配内存,指针指向其地址
44 company -> printInfo();//调用基类的打印方法
45
46 delete company;//删除指针地址
47 company = NULL;//为指针指向的地址赋空值
48
49 company = new TechCompany("APPLE","IPHONE");//指针指向新定义的子类TechCompany
50 company -> printInfo();//调用子类的打印方法
51
52 delete company;
53 company = NULL;
54
55 return 0;
56 }