您的位置:首页 > 编程语言 > C语言/C++

C++ new一次,delete多次探讨

2014-02-23 20:16 155 查看
《问题》危险的代码:

   int* p=new int(1);

   delete p;

   delete p;

 

探讨一:

   连续两次对同一个指针delete ,会造成严重的错误。编译器会检测出这样的错误吗?或许一些编译器会的,但别太过指望编译器。

 

探讨二:

   第一次delete后,p自动为空(NULL)了吗?不是的。

 

探讨三:

   在delete之前会自动检查p是否为空(NULL),如果为空(NULL)就不再delete了吗?确实是如此。

 

探讨四:

   删除为空(NULL)的指针是不会有任何问题的吗?确实是如此。

 

探讨五:

   #define SAFE_DELETE(p) delete (p); p = 0;

   这样就就万事大吉了吗?好像不是的。

   delete p+1;//在C++中是正确的

   SAFE_DELETE(p+1)将会导致错误

 

探讨六:

   没有好的方法解决重复释放这样的问题,只能靠程序员的细心了。

 

《结论》安全的代码:

   int* p=new int(1);

   delete p;

   p = NULL;

(1)delete 一次以后,p成了野指针,它作为地址的值还是有效地没还可以访问它以前指向的内存,不过那片内存被重新格式化了;
(2)p不等于NULL,用 if(p) 语句不能判断它指向的内存是否有效(此时它指向的内存无效,p本身有效);
(3)delete 一次以后,不能再次delete,否则会报错;
(4)此时如果误用p指针,仍然可以修改内存的值和从该处取出数值,但此时数据不受保护,该内存空间可能被重新被分配给别的变量;
(5)如果p指向的空间再次被new函数分配,即使是分配给别的指针,即使分配大小与原来不一样,p又恢复了效力,可以改变内存的值,甚至可以重新被delete,p的作用与新分配的指针一样;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ new delete