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

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

无法使用底层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))); } 

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

@light_keeer有一个很好的解决方案/方法,但是遇到了潜在的对齐问题@pdw 。

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

如果分配成功,则返回的指针被适当地对齐,以便可以将其指定给具有基本对齐要求的任何类型对象的指针…
C11dr§7.22.3内存管理function

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

以下是候选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  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; } 

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

如果为数组分配了内存,则应该已经跟踪该数组的长度,例如,以便您知道在迭代时停止的位置。 将该长度乘以单个元素类型的大小。

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