分类: C/C++
2009-08-03 19:11:43
string *stringptr1 = new string;
string *stringptr2 = new string[100];
...
delete stringptr1;// 删除一个对象
delete [] stringptr2;// 删除对象数组
如果你在stringptr1前加了"[]"会怎样呢?答案是:那将是不可预测的;如果你没在stringptr2前没加上"[]"又会怎样呢?答案也是:不可预测。而且对于象int这样的固定类型来说,结果也是不可预测的,即使这样的类型没有析构函数。所以,解决这类问题的规则很简单:如果你调用new时用了[],调用delete时也要用[]。如果调用new时没有用[],那调用delete时也不要用[]。
//////////////////////
这个规则对喜欢用typedef的人来说也很重要,因为写typedef的程序员必须告诉别人,用new创建了一个typedef定义的类型的对象后,该用什么形式的delete来删除。举例如下:
typedef string addresslines[4]; //一个人的地址,共4行,每行一个string
//因为addresslines是个数组,使用new:
string *pal = new addresslines; // 注意"new addresslines"返回string*, 和
// "new string[4]"返回的一样
delete时必须以数组形式与之对应:
delete pal;// 错误!
delete [] pal;// 正确
为了避免混乱,最好杜绝对数组类型用typedefs
将 inta 定义成一个整型数组类型!而且这个数组有10个元素
typedef int inta[10];后
inta x;等价于 int x[10];
typedef的规则是这样的:
从左往右看,找到第一个没有定义的字符串,用这个字符串代替除了typedef和本身后的字符串。
比如你这道题:
typedef int inta[10];
从左向右找,第一个没定义的字符串为inta,用inta就可以代替除了typedef和本身(inta)剩下的字符串了,这里剩下的字符串是int [10],所以以后用int[10]的地方都可以用inta替换