有无办法知道一个指针指向的内存区域是否为 malloc/calloc 分配的来的?

2015-10-16 09:47:54 +08:00
 aheadlead
如题。

我想过重新封装一次 malloc/calloc/free ,在分配或释放内存的时候,往一个哈希表或者平衡树里面记录。但是感觉这个方法太重,不知道有没有更好的方法?

谢谢。
1078 次点击
所在节点    C
11 条回复
SPACELAN
2015-10-16 09:55:44 +08:00
多分配几个字节,在前几个字节里加标记,然后返回偏移后的地址

但是感觉这个方法还是不行,有可能冲突
jukka
2015-10-16 10:12:06 +08:00
回答这个问题之前,希望知道你要在这个信息来做什么。
halfcoder
2015-10-16 10:14:34 +08:00
参考 redis 源码中动态字符串的内存管理实现
aheadlead
2015-10-16 11:08:35 +08:00
@SPACELAN 我现在是在这个指针所在的结构体里面加入了一个 bool 变量记录是否是 malloc 得来的。
@jukka 决定是否要 free 掉

@halfcoder
@halfcoder thx 我去看看
nocwat
2015-10-16 11:12:55 +08:00
看看这个,但并不是特别保险:

#ifdef WIN32
return _msize(p);
#else
#ifdef __APPLE__
return malloc_size(p);
#else
return malloc_usable_size(p);
#endif
#endif
kzzhr
2015-10-16 11:17:37 +08:00
刚刚试了试,发现栈区和堆去的地址相差还是很远的。可以在函数开始的时候计算一下各个变量区的地址,然后直接判断。。哈哈。仅供娱乐
VYSE
2015-10-16 11:26:11 +08:00
直接改导入表里的 malloc 地址到写好的套子里,再封装第三方函数不用你封装后的 malloc 也没有,静态库也得这样改
shuax
2015-10-16 11:32:04 +08:00
malloc/calloc 的区别只是 calloc 自动填 0 ,用完都要 free !!!
zhicheng
2015-10-16 11:33:52 +08:00
请自行 Google 内存池。
jmc891205
2015-10-16 11:49:33 +08:00
除了 malloc/calloc 你们还有另外的内存分配机制?
hitmanx
2015-10-16 11:53:32 +08:00
c++的话重载一下这个类型的 operator new,然后就像你说的弄个哈系表记录一下;或者直接弄个内存池,但是那个也一样重.

如果在某些系统上你能动态地获得当前 stack 的起始地址和 size limit 的话,应该可以判断哪些是属于栈区的.一般来说 stack 区是从高地址往低地址生长的,heap 区是从低地址往高地址生长的,stack 的地址是要在 heap 的之上的,但这只是一般情况..

话说这种应用场景我感觉应该是可以通过合理的设计规避掉的,好像在哪里看到过类似的讨论.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/228441

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX