4

我有一个关于释放指针的理论问题。

我认为有些人(程序本身或操作系统)必须跟踪指针和它们的长度。为什么?

float* pointer1 = malloc( 100 * sizeof(float) );

例如:我这里有一个浮点指针。有人能告诉我pointer1数组的长度是多少吗?没有办法通过在运行时调用函数/方法来获取该指针的长度,对吗?那么程序(或操作系统)如何在不知道运行时实际长度的情况下释放指针的内存部分:

free(pointer1);

如果程序知道指向 free 的指针的长度,为什么我们无法获取该信息并使用其他一些方法来跟踪长度。例如:

struct floatArray
{
    float* pointer;
    int length;
}

所以,我真的很好奇这个问题。我真的很想了解操作系统如何处理指针长度。

谢谢,

坐下。

4

4 回答 4

4

内存管理器确实维护有关每个已分配内存块的元数据。除了块的大小之外,这可能还包含信息。

实现这一点的一种常见方法是将元数据存储在内存中,就在用户程序用来引用块的内存地址下方。因此,如果对 malloc 的调用返回 address p,并且元数据包含n字节,则元数据将存储在 address p-nto 中p-1

于 2012-05-05T20:48:43.957 回答
2

它通常不直接是操作系统,而是malloc()实现——内存管理器,它从操作系统获取更大的内存块。通常,这些信息将存储在一些链表中,但我建议您查看您的 libcmalloc()以了解这些信息是如何存储的。

正如所指出的,没有标准的方法来做到这一点,因为不同的编译器/标准 C 库之间的实现有所不同-

于 2012-05-05T20:48:06.433 回答
1

操作系统不一定会跟踪您请求的确切长度。通常,由于各种内部原因,长度会更改(增加),或者以访问缓慢的方式存储。它可能包含编码在其中的附加信息(通常大小与 2 的幂的某个倍数对齐,并且低位用作标志)。一些 malloc 实现(尤其是嵌入式的)根本没有实现free(),也不需要存储这些信息。

C 语言设计者希望允许 C 库实现具有这种自由度,因此他们不允许程序检索 malloc 缓冲区的大小。

于 2012-05-05T20:50:19.630 回答
1

使用 MSVC 或 MinGW,您可以使用(非标准!)函数 _msize

float* pointer1 = malloc( 100 * sizeof(float) );
printf("%lu bytes with %lu elements", (unsigned long)_msize(pointer1),(unsigned long)_msize(pointer1)/sizeof*pointer1);
于 2012-05-05T21:01:36.747 回答