Effective C++ 学记之16 成对使用new和delete时要采取相同形式

如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。

如果你在new表达式中使用[],一定不要在相应的delete表达式中使用[]。

std::string* strPtr1 = new std::string;     
std::string* strPtr2 = new std::string[100]; 
...
delete strPtr1; //删除一个对象          
delete [] strPtr2; //删除一个由对象组成的数组 

如果对strPtr1使用delete[]形式:delete会读取若干内存并解释为“数组大小”,然后多次调用析构函数。

如果对strPtr2没使用delete[]形式:可能导致99个析构函数没被调用,对象不太可能被适当删除。

也就是说,以上的2中情况都可能会导致不确定的行为哟~


单一对象和对象数组的内存布局不同: 数组内存包含“数组大小”记录,以便delete知道需要调用多少次析构函数。
delete[]认定指针指向一个数组,多次调用析构函数。
因此切记 new和delete时要采取相同形式。

对于typedef动作,当以new创建该种typedef类型对象时,应该说清楚应该以哪一种delete形式删除。
考虑下面这个例子:
typedef std::string AddressLines[4];//每个人的地址有4行 每行是一个string
使用时:std::string* pal = new AddressLines;//返回一个string* 跟new string[4]一样


这里就必须匹配delete[]:

delete pal;    //行为未有定义!!!
delete [] pal; //OK

*最好尽量不讨对数组形式做typedef动作。取而代之可以使用vector<string>等templates。^-^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值