9.7 对象的动态建立和释放
- 当对象是静态的,程序运行中,对象所占空间不能随时释放。例如函数中定义一个对象,只有该函数结束时,该对象才释放。
- 为提高内存空间利用率,人们希望在用到对象时才建立对象,不用时就撤销它,释放其所占内存空间以供别的数据使用。可以用new运算符动态建立对象,用delete运算符撤销对象。
- 若已定义一个Box类,可用以下方法建立一个对象。但用户还无法访问这个对象,因为该对象既无对象名,用户又不知其地址。这种对象称为无名对象,它确实存在,但它没有名字。
new Box;
- 用new运算符动态地分配内存后,将返回一个指向新对象的指针,即所分配的内存空间的起始地址。用户可获此地址,并通过该地址来访问这个对象。这样就需定义一个指向本类对象的指针变量来存放该地址。
Box *pt;
pt=new Box;
cout<<pt->height;
cout<<pt->volume();
Box *pt=new Box(12,15,18);
- 调用对象既可通过对象名,也可通过指针。用new建立的动态对象一般是不用对象名的,是通过指针访问的,其主要应用于数据结构,如链表。访问链表中的结点,并不需要通过对象名,而是在上一个结点中存放下一个结点的地址,从而由上一个结点找到下一个结点,构成链表关系。
- 在执行new运算时,若内存量不足,无法开辟所需内存空间,大多C++编译系统都使new返回一个0的指针值。只要检测返回值是否为0,就可判断分配内存是否成功。
- 在不需要使用由new建立的对象时,可以用delete运算符予以释放。如果用一个指针变量pt先后指向不同的动态对象,应注意指针变量的当前指向,以免删错对象。
delete pt;