【问题标题】:How do dynamically allocated arrays get freed in C++?如何在 C++ 中释放动态分配的数组?
【发布时间】:2010-12-05 04:02:49
【问题描述】:

我知道你必须这样做:

int * p;
p = new int[10];

//use array

delete [] p;

现在我的问题是:由于没有明确说明,如何释放正确的内存量?操作系统是否跟踪分配的内存及其起始地址?

【问题讨论】:

标签: c++ dynamic-memory-allocation


【解决方案1】:

运行时库将跟踪分配的内存块。鉴于new 返回的初始指针,可以保证正确释放块。

虽然这个可以在操作系统本身中实现(理论上),但通常不是。操作系统跟踪的是分配给整个进程的页面,而不是在此抽象级别分配的单个块。

【讨论】:

    【解决方案2】:

    是的,操作系统(或更可能是库)保持跟踪。

    当您分配内存时,操作系统会为您的内存创建一个小标头,该标头通常就在您分配的内存之前 - 即在稍微低几个字节的地址处。

    在释放内存时,它获取被释放的指针,返回几个字节,并检查描述实际分配内容的结构,包括已分配内容的大小。

    【讨论】:

      【解决方案3】:

      它完全依赖于实现。就像您提到的常规 malloc()/free() 一样,系统必须保存一些额外的信息。通常,对 malloc() 或 new 运算符的调用会在它返回给您的指针之前在内存中设置一个头结构,以便稍后调用 free() 或 delete 运算符时它可以弄清楚发生了什么用你递给它的那块内存。

      【讨论】:

        【解决方案4】:

        这取决于实现,但我认为运行时库使用某种内存分配表来跟踪分配的块。

        【讨论】:

          猜你喜欢
          • 2018-09-01
          • 2012-01-08
          • 2017-06-13
          • 2014-02-23
          • 2013-01-27
          • 1970-01-01
          • 2021-01-18
          • 2019-11-30
          • 1970-01-01
          相关资源
          最近更新 更多