我尝试使用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;
}
我希望有人能帮助我。谢谢。