1. 如果一个block {} 或函数中有一个以上的return,或者goto,那么每个离开点都会被放置析构函数。所以,提倡下面的内容是正确的:1)一个函数尽量只有一个出口点return;2)尽量推迟变量定义,以避免不必要的构造和析构。
2. 全局对象会被初始化并设初值,局部对象不会。即使对于没有默认构造函数的全局对象,其x.n也会被初始化=0.
3. 全局对象的缺点:1)构造过程不能被try…catch控制;2)跨模块的全局静态变量的初始化顺序没有保证。
4. Local static对象:即使被调用多次,其构造函数会在第一次执行时执行且只被执行一次。析构也只有一次。
5. 如果对象没有默认构造函数或者没有不需要提供参数就可以执行的构造函数,那么定义其数组将会编译失败。
6. New A[x]必须用delete []p。VC中可以使用delete[x]p,但是[]中的x会被忽略。
7. 基类指针指向子类对象构成的数组会很有麻烦,因为一般说来sizeof(子类对象) > sizeof(基类对象),而数组析构的时候,只有基类析构函数被调用,子类析构不会被调用,所以如果子类有特殊资源需要释放的话,肯定不能给释放掉。
8. 对于base* p = new der[10],语义上的含义:p指向含有10个base的对象,其size是10*sizeof(base)=40。但是实际上,却出现了size是10*sizeof(der)=80的数组,所以语义上有冲突。释放行为由编译器而定:可能不会释放完整。
9. Placement new一般特指含有一个void*参数的new版本:1)将对象放到void*地址上;2)调用构造函数。
10. 如果有表达式产生了临时对象,那么应该对完整表达式求值结束之后才摧毁这些创建的临时对象。有两个例外:1)该临时对象被refer为另外一个对象的引用;2)该对象作为另一对象的一部分被使用,而另一对象还没有被释放。
实验代码: