13.7 练习
部分练习题的答案可以在本书的电子文档“Annotated Solution Guide for Thinking in C++”中找到,只需支付很少的费用就可以从http://www.BruceEckel.com得到这个电子文档。
13-1 创建一个class Counted,它包含一个int类型的成员变量id和一个static int类型的成员变量count。默认构造函数的开头为Counted():id(count++){。要求构造函数打印id值并且输出“it’s being created”。另外析构函数也打印出id值并且输出“it’s being destroyed”。
测试这个类。
13-2 通过使用new创建一个(练习1中的)class Counted的对象,并且用delete销毁它,来证明new和delete总是调用了构造函数和析构函数。在堆上创建和销毁这些对象的一个数组。
13-3 创建一个PStash对象,在此对象中用new创建练习1的对象。观察当这个对象超出了范围和它的析构函数被调用时有什么情况发生。
13-4 创建一个vector<Counted*>,对它使用new创建(练习1中的)。Counted对象时返回的指针填充。扫描这个vector并输出Counted对象,然后再次扫描,并删除每一个对象。
13-5 重复练习4的操作,只是增加一个Counted的成员函数f(),该函数可以输出一条信息。然后扫描这个vector并对每一个对象调用函数f()。
13-6 使用PStash重复练习5的操作。
13-7 使用第9章的Stack4.h重复练习5的操作。
13-8 动态创建一个(练习1中的)class Counted的对象数组。不使用方括号对返回指针调用delete。对此操作的结果进行解释。
13-9 使用new创建一个(练习1中的)class Counted的对象,对void*类型的返回指针进行类型转换,然后再删除它。对此运算结果进行解释。
13-10 在计算机上执行NewHandler.cpp,观察变量count的最终结果。计算可供我们的程序使用的空闲内存的数量。
13-11 创建一个类,带有重载运算符new和delete,要求含有对于单个对象和数组的两个版本。演示这两个版本的工作情况。
13-12 设计一个对Framis.cpp进行测试的程序来显示定制的new和delete比全局的new和delete大约快多少。
13-13 修改NoMemory.cpp让它含有一个int类型的数组。使它实际上没有产生bad_alloc,而是分配了内存。在main()中,建立一个像在NewHandler.cpp中的while循环,用来消耗完内存,观察一下当operator new没有测试内存是否被成功地分配时会有什么发生。然后在operator new中加入测试并产生bad_alloc。
13-14 创建一个含有定位new运算符的类,定位new运算符的第二个参数是一个string类型值。这个类还包括一个static vector<string>,用来存放第二个参数。该定位new运算符同常规的一样用来分配内存。在main()中,调用定位new并且以描述该调用的字符串作为string参数(可能要用到预处理的FILE和LINE宏)。
13-15 通过增加static vector<Widget*>来修改ArrayOperatorNew.cpp,即加入每一个Widget地址。该Widget地址是由operator new()分配内存并且当它被释放时可以通过operator delete()删除。(我们可能需要在标准C++库文件或者在本书的第2卷(可从Web站点中获得)中查找有关vector的信息。)创建第二个类MemoryChecker,含有可以打印出vector中Widget指针数目的析构函数。再创建一个含有MemoryChecker对象的程序。在main()中,动态地分配且销毁一些Widget的对象和数组。显示MemoryChecker可以阻止内存丢失。