如何在C ++中释放动态分配的数组?

时间:2009-10-08 21:41:23

标签: c++ dynamic-memory-allocation

我知道你必须这样做:

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

//use array

delete [] p;

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

4 个答案:

答案 0 :(得分:5)

是的,操作系统(或更可能是图书馆)会跟踪。

当您分配内存时,操作系统会为您的内存创建一个小标题,这通常就在您分配的内存之前 - 也就是说,地址略低于几个字节。

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

答案 1 :(得分:2)

运行时库将跟踪已分配的内存块。在new返回的初始指针的情况下,保证正确释放块。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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