Memory management 释放记忆意味着什么?这是否意味着将所有位设置为零? 我直接从管理语言开始,几乎没有任何C++经验,因此这个问题可能太过基本了。

Memory management 释放记忆意味着什么?这是否意味着将所有位设置为零? 我直接从管理语言开始,几乎没有任何C++经验,因此这个问题可能太过基本了。,memory-management,Memory Management,在.net之类的托管语言中,GC释放内存。从我读到的,C++中,这是通过调用Delphi完成的。但是它对释放内存有什么作用呢?它是否将内存位置的所有位设置为零?还是以其他方式告诉操作系统内存可以重用 更新: 我以前去过,我知道GC做什么。但这不是我的问题。我不是想问GC是如何工作的。我想理解的是,你如何判断一些记忆是空闲的 垃圾收集只是自动内存管理(因此您不需要删除任何内容,系统会为您处理)。我不是100%,它是否设置内存位置为0,但我假定它没有,因为当你在C++中使用代码>删除< /C> >时

在.net之类的托管语言中,GC释放内存。从我读到的,C++中,这是通过调用Delphi完成的。但是它对释放内存有什么作用呢?它是否将内存位置的所有位设置为零?还是以其他方式告诉操作系统内存可以重用

更新:
我以前去过,我知道GC做什么。但这不是我的问题。我不是想问GC是如何工作的。我想理解的是,你如何判断一些记忆是空闲的

垃圾收集只是自动内存管理(因此您不需要删除任何内容,系统会为您处理)。我不是100%,它是否设置内存位置为0,但我假定它没有,因为当你在C++中使用代码>删除< /C> >时,这并不是发生什么,它只是允许空间用于存储。在所有东西上写零效率要低得多,也没有必要。下面的一些链接可能有助于更全面地解释这一点:


否,它不会将位设置为零。在一个非常简单的解释中

首先,垃圾收集器必须确定哪些对象不再可访问(“不可访问”),而不是哪些对象仍然可访问或可访问。它通过简单地列出所有对象根来实现这一点。根是一个内存位置,包含指向引用对象(堆上的对象)的指针。然后,它递归地将根引用的每个对象或已标记为可访问的对象的字段或属性引用的每个对象标记为“可访问”。
有四种类型的根

  • 包含引用对象的静态变量
  • 引用堆栈上任何当前活动线程的对象
  • 方法参数中的引用类型
  • CPU寄存器指向的引用对象
  • 在确定哪些引用对象仍然可以被应用程序域中的任何代码访问(可访问)后,它会获取所有仍然可以访问的对象,如果它们之间的物理内存有任何间隙,它会通过移动其中一些对象对其进行“碎片整理”,使它们都是连续的,然后设置表示“结束”od的指针“已使用”内存到这个新的压缩碎片整理列表的末尾。所有新的内存分配,对于新实例化的对象,都是在这个指针位置之后立即从内存中分配的


    如果可访问对象使用的内存中没有间隙,它只会重置指向列表中最后一个可访问对象末尾的指针。

    在每个应用程序中,动态内存由“堆”管理“。当您的代码要求一块内存时,它会要求堆管理器分配一块内存,当您的应用程序释放该内存块时,它会将其返回给堆管理器。在传统应用程序中,必须显式返回分配的每个内存。否则,您将最终耗尽内存

    在C#或Java等语言中,运行时提供了垃圾收集器。垃圾收集器自动识别“不可访问”内存块并释放它们。不可读内存块是不再被任何变量引用的块。例如,如果您有一个指向内存块的全局变量p1,因为p1是全局变量,所以它对代码中的任何地方都可见,那么它总是可以访问的。因此,它永远不会被垃圾收集器释放。另一方面,如果在函数Foo中有一个局部变量p2,则在Foo返回后,无法再访问可值p2。垃圾收集器能够识别这些变量并释放它们指向的任何内存块


    当应用程序/垃圾收集器与堆交互时,堆可能决定从操作系统请求更多内存或将其返回操作系统。操作系统管理来自不同进程的所有内存请求,然后决定如何将实际物理内存分配给不同进程。C++中的

    < P>,如果使用“新”分配内存,则该内存将被OS分配给该特定进程,直到释放该内存或直到进程退出。 如果分配给某个进程的某部分内存意味着操作系统不允许其他进程使用该部分内存,直到该进程释放该内存。在C++中,你必须使用“删除”来释放内存。
    通过释放内存部分,进程只通知操作系统它不再使用该部分,以便操作系统可以在其他进程请求内存时分配该内存部分。在这种情况下,内存部分的内容不会更改。

    否,删除指针不会将字节设置为零。 当然,这不在标准中,但这将是一种性能开销,当内存用于复杂对象(浮动、对象、字符串等)时,严肃的实现不必费心这么做,甚至没有意义

    你可以随时尝试。 声明指向int的指针,写入整数,删除指针。 然后再次读取已删除指针的内容。 它有相同的内容吗

    int *ptr = new int;
    *ptr = 13;
    cout << "Before delete: " << *ptr << endl;
    delete ptr;
    cout << "After delete: " << *ptr << endl;
    
    int*ptr=newint;
    *ptr=13;
    
    cout
    delete
    执行三种不同的操作:

  • 运行对象的析构函数(如果是
    delete[]
    ,则运行数组中所有对象的析构函数)

  • 将对象以前使用的内存块标记为空闲

  • 如果可能,通知操作系统内存块可供其他程序使用

  • 你的问题是关于#2和#3,但它们是非常不同的东西。要理解#2是如何工作的,请记住操作系统提供的(通常)单个“堆”被分割成大小不同的小块。使用
    ne分配内存块时