1
SPACELAN 2015-10-16 09:55:44 +08:00
多分配几个字节,在前几个字节里加标记,然后返回偏移后的地址
但是感觉这个方法还是不行,有可能冲突 |
2
jukka 2015-10-16 10:12:06 +08:00
回答这个问题之前,希望知道你要在这个信息来做什么。
|
3
halfcoder 2015-10-16 10:14:34 +08:00 1
参考 redis 源码中动态字符串的内存管理实现
|
4
aheadlead OP |
5
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 |
6
kzzhr 2015-10-16 11:17:37 +08:00
刚刚试了试,发现栈区和堆去的地址相差还是很远的。可以在函数开始的时候计算一下各个变量区的地址,然后直接判断。。哈哈。仅供娱乐
|
7
VYSE 2015-10-16 11:26:11 +08:00
直接改导入表里的 malloc 地址到写好的套子里,再封装第三方函数不用你封装后的 malloc 也没有,静态库也得这样改
|
8
shuax 2015-10-16 11:32:04 +08:00
malloc/calloc 的区别只是 calloc 自动填 0 ,用完都要 free !!!
|
9
zhicheng 2015-10-16 11:33:52 +08:00
请自行 Google 内存池。
|
10
jmc891205 2015-10-16 11:49:33 +08:00
除了 malloc/calloc 你们还有另外的内存分配机制?
|
11
hitmanx 2015-10-16 11:53:32 +08:00
c++的话重载一下这个类型的 operator new,然后就像你说的弄个哈系表记录一下;或者直接弄个内存池,但是那个也一样重.
如果在某些系统上你能动态地获得当前 stack 的起始地址和 size limit 的话,应该可以判断哪些是属于栈区的.一般来说 stack 区是从高地址往低地址生长的,heap 区是从低地址往高地址生长的,stack 的地址是要在 heap 的之上的,但这只是一般情况.. 话说这种应用场景我感觉应该是可以通过合理的设计规避掉的,好像在哪里看到过类似的讨论. |