c++ 如何在C中获得分配的内存量?[duplicate]

yrefmtwq  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(230)
    • 此问题在此处已有答案**:

(17个答案)
Determine size of dynamically allocated memory in C(15个答案)
昨天关门了。
例如,我在C中用malloc分配了一些内存,以创建一个包含10个int元素的数组:

int *a = malloc(sizeof(int) * 10);

现在我想找到一种方法,在只给出a指针的情况下得到数组的大小,如果我使用sizeof(a),不管我分配了多少内存,它总是返回8,如果我使用sizeof(*a),它总是返回4,因为它是sizeof(int)
不知何故,当我执行free(a)时,它知道有多少字节的内存将被释放,正如here所回答的那样,所以我的问题是:如何获取已分配内存块的大小信息。这个问题也可以用 C++ 来问。唯一的区别是在C中,您应该使用newdelete,而不是mallocfree。在C中,似乎也没有简单的方法来获取声明为指针的数组的大小。
编辑:我找到了this question,有一个答案建议在带有glibc的系统上使用malloc_usable_size(这在archlinux上应该对我有效)我用一个指向10个int数组的第一个元素的指针试过了(在上面的示例中声明),它返回40(它应该工作的)。但是当我用100个int的数组尝试它时,它返回了408而不是400。为什么?
EDIT2:This is why.可能我不会再去寻找一个可靠的方法来确定分配内存的大小了.看起来这不是我应该做的事情.

jgovgodb

jgovgodb1#

在您的示例中,您为10个整数分配内存。
所以编译器知道分配的内存大小,因为你告诉它它是10个整数,一个整数(int)的大小取决于PC架构。
C指针只指向一个已分配块的开始,所以指针的大小对你没有帮助。
如果你只使用数组,并且你知道数组中的数据类型,你可以计算出数组中存储了多少个值。
在代码中获取这些信息没有简单的方法。有调试软件可以提供帮助,也有一些技巧可用。
然而,在C语言中,你总是先告诉编译器要分配多少内存,所以你的代码中就有了内存的大小。
要使用指针找到大小,除了开始指针和计算指针之外,还需要一个结束指针

tzdcorbm

tzdcorbm2#

一般的答案是“你不能(使用你的操作系统的默认内存分配器)"。内存分配器库偶尔会公开一个API让你检索那些数据。例如,Jemalloc支持size_t sallocx( void *ptr,int flags)函数,而mimalloc有一个mi_malloc_size函数。
如果你真的需要这种行为,要么切换到一个支持它的内存分配器,要么通过保持内存分配的数据结构和它们的大小来实现它。在C++中,这将是一个std::map<uintptr_t, size_t>,你可以使用std::prev(std::map::upper_bound(your_map))。(模错误检查)

相关问题