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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c++-对内存的释放本质是什么?
问题描述对内存的释放本质是什么?对内存的释放是不是清零?在vc、vs的情况下都是c这种的吗?那为什么多次释放同一块内存会报错呢,而且是程序崩溃,想不通,不就是清个零嘛解决方案不是清零,而是将这块内存标记为未使用,之所以不清零,是出于性能的考虑。计算机上到处有类似的设计,比如说,你删除一个文件,并不是真的将删除的文件填充0,而也是把对应的簇标记为未分配。格式化硬盘也是如此。这也是为什么删除了文件只要...
(转载)理解内存管理的本质
此文章转载coding_hello的文章(http://blog.csdn.net/coding_hello/article/details/3947793)。   看到很多使用C/C++的朋友都在内存管理上跌倒,不断的苦苦挣扎。究其原因,并非全是因为粗心导致的错误,而是在内存管理的理解上有偏差导致的混乱。个人认为关于内存的使用,最重要的一点就是认识到内存分配和释放操作的本质其实是对一片
变量的本质
变量是指其值可以变化的量。在计算机中,指令代码、数据都存储于内存中。变量也需要存储在内存中。在计算机中,每个变量都被分配了一块内存空间,在这些空间存储的就是变量的值。 在源代码中,每个变量都有变量名。实际上,编译后的目标代码里并没有变量名字,而是记录着变量在内存空间中的地址。在C语言中,通过变量名可以访问到变量的值,对变量名的访问,就是对变量值的访问。 在编译过程中,编译器会建立一张变量符号表
函数的本质
本文章参考《Linux c 程序设计大全》的第三章,自我理解的一篇文章,如果其中有什么理解失误的地方请指正。  先明白一下c语言中内存的分配和程序运行的状况 这里有一篇博客介绍很仔细,希望在读完这篇博客之后再来看这篇文章。点击打开链接    函数代码存储在内存的代码段中,每个C语言程序都有一个代码段。在翻译成汇编语言时,函数被翻译成一段相对独立的汇编代码,并且使用函数名作为标号
IOS初学,关于内存的使用和释放,以及对其方法的理解
拿String字符串来说 查了下为什么前面进行NSString alloc定义以后需要release 函数alloc是可返回一个指向n个连续字符存储单元的指针,alloc函数的调用者可以利用该指针存储字符序列 简单来说就是程序已经将其实例化,并且分配了一块内存,如果不进行回收的话,则申请的内存还在,但是却不在使用,一直占据这内存资源 1.无需手动释放的字符串创建方法 NSSt
C语言的本质(10)——指针本质
指针,大概是C语言中最难理解的概念之一了。指针这个东西是C语言中的一个基本概念,C99中对于指针的定义是:1. 指针的类型是derived from其它类型,也就是说指针的类型是由它指向的类型决定的;2. 指针是一种reference类型,即引用类型;  指针这个词出现在高级语言程序设计中,在汇编中,就没有指针这个概念,有的只是地址。计算机的每一个内存单元都是编址的,对内存的访问都是通过地址进行的
vector 避免内存频繁分配释放与手动释放vector内存
1.避免频繁重分配 关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)   对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。这个类似于realloc的操作有四个部分: 分配新的内存块,它有容器目前容量的倍数。在
java内存分配及释放
1 、 Java 的内存管理就是对象的分配和释放问题。   在 Java 中,程序员需要通过关键字 new 为每个对象申请内存空间  ( 基本类型除 外 ) ,所有的对象都在堆  (Heap) 中分配空间。   对象的释放是由 GC 决定和执行的。
C语言之变量的本质
一、变量的本质变量的本质是一段连续内存空间的别名,或者说变量是一段连续内存空间的门牌号,画个图:不管是标准数据类型,还是指针(指针也是一种数据类型),都是一样的,都是内存空间的门牌号,千万不好把变量画到内存中去。二、通过变量往内存中进行读写数据三、修改内存的方法1、直接int a = 10; a = 20;2、间接#include"stdio.h" #include"stdlib.h" #inclu
c++ 动态分配内存delete多次出现的错误
new分配内存,delete之后再次delete时会出错。 windows系统出现类似错误,问题事件名称为 APPCRASH 。 #include int main() { int *a = new int; *a = 1; std::cout << a << std::endl; std::cout << *a << std::endl; delete a;