如何获取指针指向的内存大小?

时间:2014-07-01 11:46:15

标签: c pointers memory memory-management numa

我目前正在使用NUMA机器。我正在使用numa_free释放我分配的内存。但是,与free不同,numa_free需要知道要释放多少字节。有没有办法知道指针指向了多少字节而没有将其追踪出去?

4 个答案:

答案 0 :(得分:3)

无法使用底层API获取内存大小。在某处分配时你必须记住大小。例如,您可以编写自己的分配器,分配4个额外字节,存储在前4个字节大小的缓冲区中,在释放期间,您可以从中读取缓冲区的大小:

void *my_alloc(size_t size)
{
    void *buff = numa_alloc_local( size + sizeof(size_t) );
    if (buff == 0) return 0;

    *(size_t *)buff = size;
    return buff + sizeof(size_t);
}

void my_free(void *buf)
{
    numa_free(buf - sizeof(size_t), *(size_t *)(buf - sizeof(size_t)));
}

答案 1 :(得分:2)

在报告内存指针之前存储分配大小。

@light_keeer有一个很好的解决方案/方法,但却存在潜在的对齐问题@pdw

my2_alloc(),与malloc()一样,可能会返回满足C规范对齐要求的指针。同样,my2_alloc()还需要确保返回的指针符合对齐要求。

  

如果分配成功,则返回指针适当对齐,以便可以将其指定给指向具有基本对齐要求的任何类型对象的指针...... <登记/>   C11dr§7.22.3内存管理功能

     

基本对齐由小于或等于所有上下文中实现所支持的最大对齐的对齐表示,等于_Alignof (max_align_t)。 §6.2.82

Follows是候选C99解决方案。

// Form a prefix data type that can hold the `size` and preserves alignment.
// It is not specified which is type is wider, so use a union to allocate the widest.
#include <stddef.h>
union my2_size {
  size_t size;
  max_align_t a;
}

void *my2_alloc(size_t size) {
    union my2_size *ptr = numa_alloc_local(sizeof *ptr + size);
    if (ptr) {
      ptr->size = size;
      ptr++;
    }
    return ptr;
}

void my2_free(void *buf) {
    if (buf) {
      union my2_size *ptr = buf;
      ptr--; 
      numa_free(ptr, sizeof *ptr + ptr->size);
    }
}

// Return how many bytes are pointed to by a pointer allocated with my2_alloc()
size_t my2_size(void *buf) {
    if (buf) {
      union my2_size *ptr = buf;
      ptr--; 
      return ptr->size;
    }
    return 0;
}

答案 2 :(得分:1)

如果为单个值分配了内存,则可能使用sizeof()来查找该值类型所需的空间量。您应该知道该类型是什么,因为它是指针的类型。因此,您只需在同一类型上再次呼叫sizeof()即可。 (例如,如果您将sizeof(Foo)个字节分配到Foo*,那么您也想要释放sizeof(Foo)个字节。)

如果为数组分配内存,则应该已经跟踪该数组的长度,例如:这样你就知道在迭代时要停在哪里。将该长度乘以单个元素类型的大小。

答案 3 :(得分:0)

指针只表示内存中的一个不同点,通常是数据启动的位置。开发人员始终需要跟踪该位置的可用空间。 (free是规则的例外)。