SweetDream
高歌一壶新酿酒,醉抱青山不必归。
条款5:对应的newdelete要采用相同的形式

理由:

否则会导致不可预见的结果

注意:

1、必须自己告诉delete要被删除的指针指向的是单个对象呢还是对象数组,后者需要使用"[ ]"(eg: delete [ ] stringptr2;),在删除单个对象时使用"[ ]"或者在删除数组对象的时候没有使用"[ ]"都将导致不可预见的结果。解决方法Scott总结为"如果你调用new时用了[ ],调用delete时也要用[ ]。如果调用new时没有用[ ],那调用delete时也不要用[ ]"

2、在使用typedef的时候,如果用new创建一个typedef定义的类型的对象后,该用什么形式的delete来删除。比如:

typedef string addresslines[4]; //一个人的地址,共4行,每行一个string
string *pal = new addresslines; // 注意"new addresslines"返回string*,
                                //
"new string[4]"返回的一样

delete时必须以数组形式与之对应:

delete pal;// 错误!

delete [] pal;// 正确

 

条款6:析构函数里对指针成员调用delete

增加一个指针成员意味着几乎都要进行下面的工作:

1.在每个构造函数里对指针进行初始化。对于一些构造函数,如果没有内存要分配给指针的话,指针要被初始化为0(即空指针)

2.删除现有的内存,通过赋值操作符分配给指针新的内存。

3.在析构函数里删除指针。

删除空指针是安全的(因为它什么也没做)。所以,在写构造函数,赋值操作符,或其他成员函数时,类的每个指针成员要么指向有效的内存,要么就指向空,那在你的析构函数里你就可以只用简单地delete掉他们,而不用担心他们是不是被new过。另外注意除非类成员最初用了new,否则是不用在析构函数里用delete的。
posted on 2006-02-22 22:56  SweetDream  阅读(299)  评论(0编辑  收藏  举报