zoukankan      html  css  js  c++  java
  • c++内存释放

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

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

    解决方案

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

    解决方案二:

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

    解决方案三:

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

    解决方案四:

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

    解决方案五:

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

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

    解决方案六:

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

     

    转载自   https://blog.csdn.net/imJaron/article/details/79927198

  • 相关阅读:
    [LeetCode] Range Sum Query
    [LeetCode] Additive Number
    [LeetCode] Number of Islands II
    [LeetCode] Range Sum Query 2D
    [LeetCode] Range Sum Query
    [LeetCode] Smallest Rectangle Enclosing Black Pixels
    [LeetCode] Longest Increasing Subsequence
    [LeetCode] Bulls and Cows
    [LeetCode] Binary Tree Longest Consecutive Sequence
    [LeetCode] Serialize and Deserialize Binary Tree
  • 原文地址:https://www.cnblogs.com/9527s/p/10816774.html
Copyright © 2011-2022 走看看