条款16:成对使用 new 和 delete 时要采用相同形式

发布时间:2024年01月03日

?下面程序的行为是未定义的。至少,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表达式中也不能使用[]。
文章来源:https://blog.csdn.net/qq_45526401/article/details/135374298
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。