c++ - 实际获得的动态分配内存的大小怎么确定
怪我咯
怪我咯 2017-04-17 14:20:17
0
5
671
怪我咯
怪我咯

走同样的路,发现不同的人生

Antworte allen(5)
伊谢尔伦

知乎上我有看过:

我先问你个问题:指针中是没有所在内存块大小的信息的,那么 free 怎么才能知道要释放的内存块有多大呢?于是,对于大多数内存分配器,malloc 申请的实际内存比你要求的空间要大几个字节,里面存储了额外的数据来记录这块内存有多大,一般就是直接存在指针左边。free 的时候,就会去读取指针地址减去一个常数之后的那块内存,来获取内存块的信息。因此如果你 free 一个不指向内存块开始处的指针,free 的时候就会把其他的数据错误解释成内存块的信息,(大概率)导致程序崩溃。当然现代的内存分配器对于不同大小的内存申请,会采用不同的分配策略,但无论策略如何,去 free 一个不是 malloc 来的指针,都是非常危险的举动。

见:https://www.zhihu.com/questio...

黄舟

实际分配的内存比请求的多多少标准中并没有规定,依赖于malloc的实现,这属于开发者不必关心的实现。

小葫芦

确定实际分配内存的大小

没有万能的办法。因为这属于内存分配器的实现细节。你非要知道,得去看你所使用的内存分配器是怎么分配内存的。

大家讲道理

CSAPP中有讲到这一部分,不仅会多出记录大小的头,还会因为进行对齐操作而获得比申请更多的内存

左手右手慢动作

操作系统是需要知道每个指针分配了多少内存的,我们在调用delete的时候也没有告诉操作系统这个指针只想的区域占用了多少内存,所以肯定有一个地方保存着这个值,而这个值在不同的操作系统有不同的实现,比如最简单的一种实现就是在每个指针前面一个字节用来保存内存分配的长度,一般操作系统都会提供一个函数来获取这个实际内存的大小,比如malloc_size之类的函数。
如果你有兴趣可以看看redis源码,zmalloc.h和zmalloc.c
https://github.com/antirez/re...

#if defined(USE_TCMALLOC)
#define ZMALLOC_LIB ("tcmalloc-" __xstr(TC_VERSION_MAJOR) "." __xstr(TC_VERSION_MINOR))
#include <google/tcmalloc.h>
#if (TC_VERSION_MAJOR == 1 && TC_VERSION_MINOR >= 6) || (TC_VERSION_MAJOR > 1)
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) tc_malloc_size(p)
#else
#error "Newer version of tcmalloc required"
#endif

#elif defined(USE_JEMALLOC)
#define ZMALLOC_LIB ("jemalloc-" __xstr(JEMALLOC_VERSION_MAJOR) "." __xstr(JEMALLOC_VERSION_MINOR) "." __xstr(JEMALLOC_VERSION_BUGFIX))
#include <jemalloc/jemalloc.h>
#if (JEMALLOC_VERSION_MAJOR == 2 && JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2)
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) je_malloc_usable_size(p)
#else
#error "Newer version of jemalloc required"
#endif

#elif defined(__APPLE__)
#include <malloc/malloc.h>
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) malloc_size(p)
#endif

还可以了解一下 tcmalloc 和 jemalloc 的实现

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage