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;
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++中将导致一个内存错误.
2 * ptr = ' a ' ;
3 if (ptr)
4 delete ptr;
5 // ptr = NULL;
6 if (ptr)
7 delete ptr;
在开头给出的网页上有这么一句: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.