我有一个函数,该函数在被调用时从struct Pieces*中获取一个struct Torrent字段,并根据char数组中包含的信息对其进行初始化。

这是函数调用的样子(metadata.c:230):

get_pieces(t.pieces, &t.num_pieces, data);


get_pieces()函数中,我初始化t.pieces,如下所示(metadata.c:65):

pieces = calloc(*num_pieces, sizeof(struct Piece));


但是,当我运行valgrind时,它说:

==8701== 76,776 bytes in 1 blocks are definitely lost in loss record 634 of 634
==8701==    at 0x4C28349: calloc (vg_replace_malloc.c:467)
==8701==    by 0x4025A4: get_pieces (metadata.c:65)
==8701==    by 0x402CDB: init_torrent (metadata.c:230)
==8701==    by 0x404018: start_torrent (torrent.c:35)
==8701==    by 0x40232E: main (main.c:17)


即使我的程序终止时t->pieces指针仍然可用,并且可以释放指针。为什么会有这种泄漏记忆?

完整的源代码位于https://github.com/robertseaton/slug

最佳答案

这会泄漏内存,因为您的get_pieces函数正在传递指向Pieces的指针:

void get_pieces (struct Piece* pieces, ...


然后,您可以在此方法内将内存分配给pieces。当它返回时,已分配的内存将不再受任何东西访问。

这是因为您的指针是按值传递的-重新分配指针不会更改调用函数的副本。为了影响该调用函数,您必须将指针传递给该指针,以便可以正确分配原始副本:

void get_pieces (struct Piece** pieces, ...
     // ...
      *pieces = malloc(...


并且,在呼叫站点,将地址传递给指针。

关于c - 为什么会有这种泄漏内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7029237/

10-10 08:36