我正在尝试围绕malloc
编写一个包装函数。这是我编写的代码,但我不确定它是否有用。
有人可以看看它,让我知道它是否有效,如果不是,为什么不呢?
int main()
{
int i=1;
char *k;
while(i<3)
{
i++;
k = (char *) CountMalloc(1024);
printf(" Total mem : %d \n Memory Address:%x \n",Totalmem,k);
}
printf(" Exiting\n");
return 0;
}
这是我分配内存并尝试传递void的函数
指针。我知道这有效,如果我声明一个指针,如果我将其地址传递给我的函数和函数调用malloc
并将地址分配给传递的指针。但我想知道以下代码是否有效:
void * CountMalloc( int size )
{
char *p;
Totalmem += size;
return ( malloc (size) );
}
答案 0 :(得分:5)
一些注意事项:
malloc()
的参数声明为size_t
,因此size
的{{1}}参数也应为CountMalloc()
。
您不会检查size_t
的结果,看看分配是否成功。考虑这样做:
malloc()
但请注意,分配的内存总量可能会更高。大多数void * CountMalloc(size_t size)
{
void * allocation = malloc(size);
if (allocation) {
Totalmem += size;
}
return allocation;
}
实现分配的内存多于您请求的内存,以便它们可以在返回的内存中存储有关分配的一些信息。
否则,我认为没有严重的问题会阻止代码产生你想要的效果。
答案 1 :(得分:0)
虽然您的代码将通过malloc()
跟踪内存请求的总量,但它并不能真正跟踪返回的对象使用的内存总量。大多数分配器都不会返回任意大小的对象,而是拥有固定大小的对象池(4个字节,8个字节等)并返回可以满足请求大小的最小对象。
即使它允许任意大小的对象,它仍然会经常舍入返回的内存块的大小,具体取决于硬件是否允许字节或字寻址,或最大化对象可重用性。
最后,正如我在对另一个答案的评论中所述,该对象通常会有一个隐藏的标题来存储对象的大小,以便后续的free()
可以知道返回的块有多大。