两个指针指向同一个new开辟的空间,当释放其中一个指针后,为什么另一个指针还能操作这个空间?

我在一个函数里开辟了一个空间,然后用指针b指向这段空间,再返回给main函数,用指针b接收,再让指针c也指向这段空间,然后我释放了b指向的这段空间(那不也是c指向的空间吗?)为什么释放后,c还能去操作这段空间。(delete不是释放new开辟的空间吗?要是空间被释放了,那所有指向这段空间的指针不是应该都不能再操作这段空间了吗?)

在我理解中,delete是释放一个空间,不管多少个指针指向,只要以其中一个指针为载体,释放这空间后,其他指向这空间的指针就没有权限操作这空间了。

delete只是通知系统释放内存,但内存仍然是可以读写的,释放的内存允许其他new或者函数调用申请使用,你如果在其中进行操作,可能会干扰到申请使用者

即使没有申请,有些内存你是可以操作的,只是后果不明而已,因此指针使用规则就是,自己申请的,就在自己申请的范围内使用,系统不会为你判断是否越界使用的,一切后果自行承担

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-12-19

你没有理解指针和内存的关系,你在程序退出的时候应该会遇到堆损坏的告警。

new出来的那个指针在堆上开辟了一块内存,这块内存会被这个指针占用,其它新new出来的指针不会再利用这块内存,这个时候你用另一个指针指向它,即两个指针指向了堆上的同一块内存,这个时候实际上delete就会宣告指针对这块内存的独占结束了,这块内存现在可能会被新new出来的指针占用。

但是,记住!delete只是解除了new出来的指针对它指向内存的占用,而不是删除指针或者这块内存,delete之后指针仍然存在,仍然指向这一块内存。

你仍然能赋值和读取,但是在程序退出时,程序析构函数会析构到被放弃占用的内存上面(你赋值的时候动态指针就变成了不安全的静态指针,之所以不安全是因为系统不会维护这块内存了,这块内存随时会被其它成员占用),并且程序不能操作堆内存,这会造成堆损坏问题

第2个回答  2020-01-03
1,C/C++没有授权这个概念,C语言(含C++)之所以称为程序员的语言就是说,作为程序员的你,权限是最大的,你可以做任何事情.访问权的管理是程序员的事情,就如同数组边界检查工作同样是程序员的事
2,new只不过程序向系统申请一块可用内存,而系统会检索注册表(不是windows注册表)通过已占用内存计算出一块未被占用的且可以容纳申请长度的内存给程序,并且标记这块内存已占用,然后返回首地址,这个机制只不过防止内存重复分配,避免数据被其他程序覆盖掉,但是读写是开放的.
3,通过指针DELETE,就是告知系统这个指针指向的地址空间我不要了,而系统做的事情仅仅是删掉这个注册记录,那么这个地址的空间下次可以再分配了,也就是回收了,但是内容不需要清掉,清理掉多此一举,太浪费CPU时间了,因为下次分配时程序会用数据或者通过初始化覆盖掉废弃的数据.
因此当一个指针释放后,你的程序的其他指针还是指向原地址,而这块地址没被其他程序占用时,里面的数据还在,因此用其他指针访问它还是可以的,但是万一,在你释放后,多任务系统下,其他进程的线程马上申请了这块内存,那你程序读出的数据可能变化了,但是写的话就会干扰主权程序的运行.从而可能会导致系统奔溃.
第3个回答  2019-11-08
读或许可以,写是绝逼不行.
你这种情况叫悬挂指针,指向的不是你合法能使用的空间,不出问题完全是巧合,瞎鸡儿搞.

打个比方,你向国家申请了一个男/女朋友,你用完上交了,国家可能要分配给别人了。上交以后,你一次两次撩搭没出事,不代表国家或ta新伴侣不会揍你.追问

但是我这 用C赋值了,还输出了,我试了很多了,撩了很多次,都可以

追答

不出现悬挂指针,不使用自己没有申请到的内存是程序安全的基本保证,渣男没挨打是因为没被性病制裁过,以后写代码不能这么干,工程项目中这么干一定会被申请把你调离,给同事埋雷。

相似回答