高手请进,关于释放内存,谢谢!

东方龙 发布于 2013/04/16 22:35
阅读 337
收藏 1

void Free32(void *ptr) throw() { free(((void**)ptr)[-1]);}

这是个非常难懂的函数定义,想了半天,不知道啥意思,求解释?谢谢!

加载中
0
地瓜儿
地瓜儿
为了释放ptr的实际内存 
0
猫哥-u
猫哥-u
ptr 看样子是个指针数组,释放的是指针数组位于ptr位号前一个的指针所指向的内存
0
东方龙

引用来自“猫哥.”的答案

ptr 看样子是个指针数组,释放的是指针数组位于ptr位号前一个的指针所指向的内存
这个兄弟说的不错,应该是这样的。
0
东方龙

我自己解答一下:

以这么理解ptr实际是个指针数组的一个地址指针,而函数最终释放的是ptr这个元素的前一个元素,前一个元素也是地址,就是释放这个地址的内存。

0
Jerikc
Jerikc
这个你可以一步一步拆分地分析,首先你得知道:
    1. &是取地址,*是引用该地址的内容

   2. a[1] 等价于 *(a + 1), 所以 *(a - 1)等价于 a[-1],(或者-1[a])

对于void Free32(void *ptr) throw() { free(((void**)ptr)[-1]);}


typedef void* Pointer;
 Pointer *p = (Pointer *)ptr;
 Pointer actualPointer = *(p - 1); // Pointer actualPointer = p[- 1];
 free(actualPointer);


       ___________________________    _____________
p-1-->| void*类型  actualPointer--|-->| void类型 a  |
       ___________________________    _____________
       ___________________________    _____________
p---> | void*类型               --|-->| void类型 b  |
       ___________________________    _____________

则a的内存地址的控制权交给了OS

希望对你有帮助




0
东方龙

引用来自“Jerikc”的答案

这个你可以一步一步拆分地分析,首先你得知道:
    1. &是取地址,*是引用该地址的内容

   2. a[1] 等价于 *(a + 1), 所以 *(a - 1)等价于 a[-1],(或者-1[a])

对于void Free32(void *ptr) throw() { free(((void**)ptr)[-1]);}


typedef void* Pointer;
 Pointer *p = (Pointer *)ptr;
 Pointer actualPointer = *(p - 1); // Pointer actualPointer = p[- 1];
 free(actualPointer);


       ___________________________    _____________
p-1-->| void*类型  actualPointer--|-->| void类型 a  |
       ___________________________    _____________
       ___________________________    _____________
p---> | void*类型               --|-->| void类型 b  |
       ___________________________    _____________

则a的内存地址的控制权交给了OS

希望对你有帮助




我做了一个内存的测试,具体程序片段如下:void* ptr = malloc(sizeof(int)*8);
    if(ptr == 0)
    {
        printf("Error when locate memory !\n");
    }else{
        printf("memory is allocated here !\n");
    }
    printf("Pointer 1st is : %x\n", ptr);
    printf("Pointer 2nd is : %x\n", ((void**)ptr)[0]);



程序执行结果如下:


memory is allocated here !
Pointer 1st is : 1ed5040
Pointer 2nd is : 0


很奇怪吧,呵呵

0
中山野鬼
中山野鬼

引用来自“怪兽狂殴奥特曼”的答案

@中山野鬼 ,求解答
代码不全吧。通常是申请时,做基地址对其,实际使用的指针,会和申请的指针有个向后偏移的动作。所以释放时,需要释放当前指针所指向空间前面的地址。 看这个函数对应的比如 Malloc32函数就明白。空看Free32没意义。
0
东方龙

引用来自“中山野鬼”的答案

引用来自“怪兽狂殴奥特曼”的答案

@中山野鬼 ,求解答
代码不全吧。通常是申请时,做基地址对其,实际使用的指针,会和申请的指针有个向后偏移的动作。所以释放时,需要释放当前指针所指向空间前面的地址。 看这个函数对应的比如 Malloc32函数就明白。空看Free32没意义。

你提醒了我:


ISDTAPI void *Malloc32(int sz,const bool clear) throw(BadAlloc){
   char *ptr = (char*)Malloc(sz+32,clear);
   void *pt = (void*)(ptr + 32 - ((ptr - (char*)NULL) & 31));
   ((void**)pt)[-1]=ptr;
   return pt;
}
ISDTAPI void *Malloc32(int n1,int itsz,const bool clear) throw(BadAlloc){
   return Malloc32(n1*itsz,clear);
}


我们看一下这个定义!

0
东方龙

补充:


ISDTAPI void *Malloc(int sz,const bool clear) throw(BadAlloc){
   void *pt=malloc(sz); if (!pt) {
       char str[50];
       sprintf (str, "Memory allocate %d bytes", sz);
       throw BadAlloc(str);
   }
   if (clear) {
      if (sz>1)
         ippsZero_16s ((short*)pt, sz>>1);
      if (sz&1) ((char*)pt)[sz-1]=(char)0;
   }
   return pt;
}

返回顶部
顶部