任何功能查询已分配块的大小?(Any function to query the size of a

2019-07-18 03:42发布

我意识到,任何这样的功能很可能是非标准,但没关系我的使用情况。 基本上,我需要一种方法,我可以将指针传递给返回块中的指针的大小(这是由先前调用返回到malloc()函数的指针)(即使它通过的glibc的系统调用()接口仅暴露)指着。 这样的事情存在吗?

Answer 1:

所以,据我所知,至少有在C90 / C99无此功能。 一些系统上,大多数的libc,提供(在Mac OS X如malloc_size())获得分配的大小的功能,但这并不是便携,或许你应该避免使用的最好的。



Answer 2:

有没有必要使用非标准的功能,它不是很难与必要的功能写你自己的分配器。

你必须知道的大小,当你分配的块,所以干脆保留该信息。 有少数情况下IMO,当你不知道的信息,因为根据定义,你知道它,当它被分配。 但是,如果你需要这样的功能,你可以做到这一点只需通过包装的malloc()和预未决大小的块。

void* smalloc( size_t size )
{
    // allocate block with additional space for size
    void* blk = malloc( size + sizeof(size_t) ) ;

    // set the size
    *((size_t*)blk) = size ;

    // return pointer to block after size field (user block)
    return ((size_t*)blk) + 1 ;
}

void sfree( const void* blk )
{ 
    // Free from the size field address, not the user block
    free( ((const size_t*)blk) - 1 ) ;
}

size_t ssize( const void* blk )
{
    // Size is immediately before user block
    return *(((size_t*)blk) - 1) ;
}

在吉姆·巴克的观点; 在一些目标的,可能需要一些拉坯以保持必要的对齐。 有些目标会产生低效率的代码,如果对准不是最优的,别人会导致中止。 所以要小心这个解决方案。 我个人持谨慎态度考核的需要这一解决方案!

一种解决方案也许将是使用一个数据结构,诸如哈希表与所述的malloc地址作为密钥,并且大小为内容,并使用相同的包装技术从块分开存储大小 - 牺牲或性能,额外的存储,并且在可管理块的数量方面的能力或许有些有限的限制。

但是你这样做,根本点依然有效 - 包装的基本服务提供你所需要的。



Answer 3:

_msize在Windows平台上。



文章来源: Any function to query the size of an allocated block?