通过标准库访问malloc存储的元数据是否可行/可取?

bkhjykvo  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(125)

新手c程序员在这里。这可能是无稽之谈。
我已经学习了一些使用mallocfree动态内存分配的基础知识。当我分配内存时,具体来说,比如通过malloc分配10个ints的数组,malloc返回给我一个指针p,指向所分配内存块的开头。通常我会将该指针以及一些关于内存分配的相关元数据(即,它是针对int的长度为10的数组),以支持后续的知情和安全的读/写访问。这就是我所做的,在代码中传递这些元数据。
有趣的是,当真正释放内存的时候,free完全有能力完成这项工作,只需要指针p;它不需要被告知,例如数组的长度。我不知道这里的任何细节,但是从我所读到的,malloc/free的实现涉及存储和访问在每个分配附近写入的元数据,并且元数据在解除分配时由free访问(并且显然足以使它精确地知道哪些内存位置应该被释放)。我想这一定特别意味着在我的例子中,分配的int数组的长度可以从free正在查找的元数据中收集。
这使我产生了几个问题:
1.我对这个元数据的存在的理解的高级细节是正确的吗?
1.这个分配元数据是否可以由使用标准库的c程序员访问?
1.如果没有,它能通过标准库以外的方法从c中容易地访问吗?
1.如果对2或3的回答是否定的,原因与标准和规则有关,是否有特定的上下文或示例(例如,仅在特定操作系统上工作,或与特定的非标准c实现等),这是可能的和/或有用的?
1.如果这是个坏主意,不管它是否可行,我都很想知道为什么。到目前为止,我唯一的猜测是元数据存储的细节可能会因系统而异,因此天真地使用它的代码可能最终无法容忍系统的变化。尽管如此,考虑到free可以在不同的系统上成功地理解它,我认为应该有一种方法来封装系统依赖项,以便仍然能够对元数据进行有用的内省。
对于两三个人,我想象着这样的事情:

// Allocate some memory
int size = 10;
int *arr;
arr = (int *)malloc(sizeof(int) * size)

// Do other stuff.
// Choose not to keep track of storage details necessary for informed read/write access to arr, e.g. size;

// Acquire access to whatever `free` would access if asked to free `arr`
_type_ metadata = get_pointer_metadata(arr);

// Use metadata to perform read/writes

但是不知道c标准库中有没有类似get_pointer_metadata的东西,或者第三方包?
我曾尝试在谷歌上搜索这样的功能,但我对具体情况和语言的理解太差,无法进行有意义的搜索。

klr1opcd

klr1opcd1#

通过标准库访问malloc存储的元数据是否可行/可取?
不可以。标准C库不提供这种访问。
1.我对这个元数据的存在的理解的高级细节是正确的吗?
元数据确实存在--但是存在的位置和内容更加多样。元数据可以被编码在指针本身中。原始分配大小可能不存在。
1.这个分配元数据是否可以由使用标准库的c程序员访问?
没有。
1.如果没有,它能通过标准库以外的方法从c中容易地访问吗?
也许吧。一些编译器/库提供这样的访问。这是实现相关的。
1.如果对2或3的回答是否定的,原因与标准和规则有关,是否有特定的上下文或示例(例如,仅在特定操作系统上工作,或与特定的非标准c实现等),这是可能的和/或有用的?
是的,有一些具体的例子。因为我是为了可移植性而编写代码的,所以我不使用它们,而是让代码跟踪相关的元数据本身。
1.如果这是一个坏主意,不管它是否可能,我会好奇地听到为什么。...
与其说是一个"坏"主意,不如说是一个软弱的主意。
元数据通常是特定于实现的,所以如果库强制访问这样的数据,那将"约束"一个实现遵循一个限制性的内存模型。
与其实现特定的解决方案,不如考虑用元数据形成一个结构,并将其传递。

typedef struct {
  void *ptr;
  size_t size;
} ptr_sz;

相关问题