malloc周围的包装会起作用吗?

时间:2014-06-06 21:41:05

标签: c

我正在尝试围绕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) );
}

2 个答案:

答案 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()可以知道返回的块有多大。