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
那要加if吗?随个人喜好了,但千万不要忘了给delete过的对象赋NULL.
想做些令人惊奇的东西出来