delete之前是否需要if

        http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.8这里说不用if判断,但这样真的可以么?

1       char *  ptr  =   new   char ();
2       * ptr  =   ' a ' ;
3      delete ptr;
4       // ptr = NULL;
5      delete ptr;

       上面的代码在Dev-C++中可以顺利通过编译并运行,但在VC++中会报一个内存错误.这也许就是我们在delete之前加if判断的原因.但加了之后就安全了么?看下面

1       char *  ptr  =   new   char ();
2       * ptr  =   ' a ' ;
3       if (ptr)
4          delete ptr;
5       // ptr = NULL;
6       if (ptr)
7          delete ptr;
       在Dev-C++中没报错,VC++还是报错,为什么? 因为delete一个对象之后,这个对象并不是NULL(地址0),delete只是将指定的内存区域清空,但这并不代表NULL,所以那两个if都为真,也就执行了两次delete,如同第一段代码的结果, delete两次在VC++中将导致一个内存错误.
       在开头给出的网页上有这么一句:The C++ language guarantees that delete p will do nothing if p is equal to NULL.(delete p;如果p等于NULL则不做任何事情).这里就明了了,在VC++中对象被delete之后没有被设置为NULL,所以报错.去掉上面代码的注释,在两种编译器中都可以正常编译运行.
       那要加if吗?随个人喜好了,但千万不要忘了给delete过的对象赋NULL.

转载于:https://www.cnblogs.com/Alacky/archive/2007/11/12/957290.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值