我有一个函数,该函数在被调用时从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/