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.
 posted on 2007-11-12 22:05  *Alacky  阅读(969)  评论(0编辑  收藏  举报