2 hchchc6016 hchchc6016 于 2016.04.02 03:43 提问

对内存的释放本质是什么?

对内存的释放是不是清零?在vc、vs的情况下都是c这种的吗?那为什么多次释放同一块内存会报错呢,而且是程序崩溃,想不通,不就是清个零嘛

6个回答

caozhy
caozhy   Ds   Rxr 2016.04.02 07:30
已采纳

不是清零,而是将这块内存标记为未使用,之所以不清零,是出于性能的考虑。计算机上到处有类似的设计,比如说,你删除一个文件,并不是真的将删除的文件填充0,而也是把对应的簇标记为未分配。格式化硬盘也是如此。这也是为什么删除了文件只要没有写入新的文件你还能将它找回来的原因。
重复释放内存报错的原因是因为这些内存已经标记为未分配,就不再有记录了,所以再次释放标准库就会丢出异常。

lyhoo163
lyhoo163   Rxr 2016.04.02 08:12

1、内存是一个由连续地址,引导的存贮器。数据存入内存,需要依据存入的数据大小,开辟一个区域,用于存贮。并且将区域,标识为已存入数据。这样,一是通过标识,可以读取数据,二是不被其它数据覆盖。
2、当内存需要清零时,操作上不是清零,而是取消这块内存保存数据的标记。这样,这块内在,又可以被使用了。
3、数据不清零,是因为没有必要。当其它数据存入时,原来数据可以被新的数据覆盖。
4、重复释放内存,也就是对该块内在,再将取消标识。此时,代码发现此内存已经取消标识,发出报错信息。提醒用户。
5、在内存的操作上,是一项很危险的操作,是具有造成危害安全的操作,特别是你定义的内存块越界,轻则本程序崩溃,重则造成操作操作系统死机。

tr1912
tr1912   2016.04.02 09:32

多次释放会报错原因就是你释放的是一个对象或者一个变量,第一次释放之后,他就已经被标记为空或者无了,当你再次释放的时候会出现找不到要释放对象的错误。
如果没有这个限制什么时候释放空间都可以的话,当你释放了之前所占用的空间,然后有别的程序占用了它,你再次释放这个地方的时候就会造成别的程序的崩溃。

starytx
starytx   Rxr 2016.04.06 16:22

应该是一种控制权的释放(转移,比如分给你的地,使用权归你,你不种了要给村委会说一下,人家就给你注销掉了,也就是把这块地标为没有人使用,从而可以再分配给其他人使用)

WinsenJiansbomber
WinsenJiansbomber   2016.04.02 05:41

不能理解为清零哦。“对内存的释放”这种表达也容易让人混淆,应该理解为内存回收再利用,是内存管理的概念。如果一个程序运行中只申请内存而不把内存还给系统,再多的内存也会被吃光的。

而像JAVA这种语言,因为内置了垃圾机制,不用程序员主动释放内存引用,到一定条件后就会由机制进行清理。C++则不同了,如果是通过 NEW、MALLOC分配的动态内存,就需要程序自己进行清理,而且不能重复清理。

oyljerry
oyljerry   Ds   Rxr 2016.04.02 09:33

是标记这块内存不在需要使用 系统回首 而且一般可能会为0 但是很多指针访问空的时候会异常

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!