下面程序的行为是未定义的。至少,stringArray指向的100个string对象中有99个不太可能被正确地析构。
被delete的指针指向单个对象还是一个对象数组?内存数组通常包括数组的大小,delete可以知道需要调用多少个析构函数。
使用delete时使用了方括号,delete假定指向的是一个数组。否则,它假定指向一个对象。
std::string *stringPtr1 = new std::string;
std::string *stringPtr2 = new std::string[100];
...
delete stringPtr1; // delete 一个对象
delete [] stringPtr2; // delete 一个对象数组
对于喜欢使用宏typedef的人来说,这条规则也值得注意,因为它意味着当使用new来生成typedef类型的对象时,必须说明应该使用哪种形式的delete。例如,考虑下面的typedef:
typedef std::string AddressLines[4]; // 一个人的地址有4行字符串,
std::string *pal = new AddressLines; // 注意“new AddressLines”返回string*
// 就像"new string[4]"一样
delete pal; // 未定义的!
delete [] pal; // 可以
为了避免这种混淆,请避免对数组类型使用typedef,可以使用vector替代。
- 如果在new表达式中使用[],则在相应的delete表达式中必须使用[]。
- 如果在new表达式中不使用[],那么在相应的delete表达式中也不能使用[]。