在IOS下覆盖malloc时如何避免递归调用

时间:2018-08-11 08:32:11

标签: c++ ios recursion malloc

我尝试使用malloc_zone_t覆盖malloc以配置内存分配信息。为了避免在多线程中递归调用,我尝试像这样使用线程局部变量(“ __thread”):

static __thread u_int zw=0;
void *my_malloc(malloc_zone_t*zone,size_t size)
{

    malloc_printf("malloc(zone=%p,size=%p)",zone,size);
    void*p =orig_malloc(zone,size);
    inter_a++;
    zw++;
    if(zw<=1)
    {
        //record some information
    }
    zw--;
    return p;
}

但是,无论何时将__thread变量“ zw”用作左值或右值,都将调用malloc,以便“ zw”本身调用递归malloc调用。 我想知道是否有一种方法可以在覆盖malloc时避免在IOS下的多线程中进行递归调用。这是我的代码:

#include <iostream>
#include <pthread.h>
#include<malloc/malloc.h>
static malloc_zone_t ori_zone;
static void*(*orig_malloc)(malloc_zone_t*zone,size_t size);
static void (*orig_free)(malloc_zone_t*zone,void*p);
static void (*orig_free_def)(malloc_zone_t*zone,void*p,size_t size);
int inter_a,inter_b;
using namespace std;
static __thread u_int zw=0;

void *my_malloc(malloc_zone_t*zone,size_t size)
{


    malloc_printf("malloc(zone=%p,size=%p)",zone,size);
    void*p =orig_malloc(zone,size);
    inter_a++;
    zw++;
    if(zw<=1)
    {
        //record some information
    }
    zw--;
    return p;
}

void my_free(malloc_zone_t*zone,void*p)
{
    malloc_printf("freeZW(zone=%p,ptr=%p)",zone,p);
    orig_free(zone,p);
    inter_b++;
    return;
}

void my_free_def(malloc_zone_t*zone,void*p,size_t size)
{
    malloc_printf("freeZW(zone=%p,ptr=%p)",zone,p);
    orig_free_def(zone,p,size);
    inter_b++;
    return;
}



int main(int argc, const char * argv[]) {
    malloc_zone_t*zone = malloc_default_zone();
    ori_zone = *zone;
    orig_malloc = zone->malloc;
    orig_free = zone->free;
    orig_free_def = zone->free_definite_size;
    zone->malloc = &my_malloc;
    zone->free = &my_free;
    zone->free_definite_size = &my_free_def;
    inter_a = 0;
    inter_b = 0;
    int*ptr= (int*)malloc(100000);
    free(ptr);
    return 0;
}

我希望有人能帮助我。谢谢。

0 个答案:

没有答案